본문 바로가기

Dead Code/DEPRECATED-KOTLIN

[코틀린코드연습장] 아무 기능도 없는 그림판



그림판에는 광고가 있으니, 그냥 그림판을 만들어볼까 했는데, 

쉽지 않고만... 인터넷을 뒤져서 한번 해본다.


그림판 지우기는 편의상 옵션메뉴로 처리(배운걸 써먹는구만 ㅋ)




[메인.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>



음... 별거 아닌것 같지만 좀 복잡하니.. 공부 열심히 혀야겠다.