그림판에는 광고가 있으니, 그냥 그림판을 만들어볼까 했는데,
쉽지 않고만... 인터넷을 뒤져서 한번 해본다.
그림판 지우기는 편의상 옵션메뉴로 처리(배운걸 써먹는구만 ㅋ)
[메인.xml]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:padding="0dp"
tools:context="com.tistory.sunnybong.pic.MainActivity">
<com.tistory.sunnybong.pic.CanvasView
android:id = "@+id/canvas"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
/>
</RelativeLayout>
[메인.kt]
class MainActivity : AppCompatActivity() {
lateinit var canvasView: CanvasView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
canvasView = findViewById(R.id.canvas)
// clearCanvas.setOnClickListener(ClearCanvas(canvasView) as View.OnClickListener)
}
// fun ClearCanvas(view: View) {
// canvasView.ClearCanvas()
// }
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu, menu)
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when(item?.itemId) {
R.id.erase -> canvasView.ClearCanvas()
}
return super.onOptionsItemSelected(item)
}
}
[캔버스 만들기 클래스.kt]
class CanvasView(internal var context: Context, attrs : AttributeSet?) : View(context, attrs) {
private var mbitmap : Bitmap? = null
private var mCanvas : Canvas? = null
private var mPath : Path = Path()
private var mPaint: Paint = Paint()
private var mX : Float = 0.toFloat()
private var mY : Float = 0.toFloat()
init {
mPaint.isAntiAlias = true
mPaint.color = Color.rgb(255,0,216)
mPaint.style = Paint.Style.STROKE
mPaint.strokeJoin = Paint.Join.ROUND
mPaint.strokeWidth = 4f
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
canvas!!.drawPath(mPath, mPaint)
}
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
mbitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)
mCanvas = Canvas(mbitmap)
}
private fun onStartTouchEvent(x:Float, y:Float) {
mPath.moveTo(x,y)
mX = x
mY = y
}
private fun onMoveTouchEvent(x:Float, y:Float) {
val dx = Math.abs(x - mX)
val dy = Math.abs(y - mY)
if(dx >= TOLERANCE || dy >= TOLERANCE) {
mPath.quadTo(mX,mY,(x+mX)/2,(y+mY)/2)
mX = x
mY = y
}
}
private fun upTouchEvent(){
mPath.lineTo(mX,mY)
}
fun ClearCanvas(){
mPath.reset()
invalidate()
}
override fun onTouchEvent(event: MotionEvent): Boolean {
val x = event.x
val y = event.y
when(event.action) {
MotionEvent.ACTION_DOWN -> {
onStartTouchEvent(x,y)
invalidate()
}
MotionEvent.ACTION_MOVE -> {
onMoveTouchEvent(x,y)
invalidate()
}
MotionEvent.ACTION_UP -> {
upTouchEvent()
invalidate()
}
}
return true
}
companion object {
private val TOLERANCE = 5f
}
}
[옵션메뉴.xml]
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/erase"
android:icon="@android:drawable/checkbox_off_background"
android:title="Erase"
app:showAsAction="always" />
</menu>
음... 별거 아닌것 같지만 좀 복잡하니.. 공부 열심히 혀야겠다.
'Dead Code > DEPRECATED-KOTLIN' 카테고리의 다른 글
[코틀린코드연습장] Handler.. sendMessage (0) | 2019.01.16 |
---|---|
[코틀린코드연습장] Permissions. (0) | 2019.01.12 |
[코틀린코드연습장] 쓰레드(3) ... AsyncTask (0) | 2019.01.11 |
[코틀린코드연습장] 쓰레드(2).. 핸들러를 활용한 반복 (0) | 2019.01.11 |
[코틀린코드연습장] 쓰레드.(1) (0) | 2019.01.10 |
[코틀린코드연습장] 텍스트뷰 자동완성 - autoCompleteText ; ArrayList (0) | 2019.01.03 |
[코틀린코드연습장] Activity 전환(Anko) (0) | 2019.01.01 |
[코틀린코드연습장] RecycleView 뭐에다 쓰는건가 (0) | 2018.12.27 |
[코틀린코드연습장] 옵션메뉴에 붙어있는 검색창 사용하기 (0) | 2018.12.24 |
[코틀린코드연습장] 다이얼로그 - 날짜/시간 입력 다이얼로그 (0) | 2018.12.21 |