본문 바로가기

Android/DrawingBoard demo 2

Android DrawingBoard 02

안드로이드에서 Double Buffering, Touch Event 등을 이용하여 그림을 그리고 지우는 예

앞서 작성한 그리기 예제는 여기를 참조하세요

MainActivity.java

package com.example.androidapp; import android.app.Activity; import android.graphics.Point; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.widget.TextView; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new DrawingBoard(this)); } }


MainActivity.java

package com.example.androidapp; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Paint.Cap; import android.graphics.Rect; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.Toast; public class DrawingBoard extends View { Canvas cacheCanvas; Bitmap backBuffer; int width, height, clientHeight; Paint paint; Context context; public DrawingBoard(Context context) { super(context); this.context = context; init(); } public DrawingBoard(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; init(); } private void init() { setBackgroundColor(Color.WHITE); WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); width = wm.getDefaultDisplay().getWidth(); height = wm.getDefaultDisplay().getHeight(); cacheCanvas = new Canvas(); backBuffer = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888); cacheCanvas.setBitmap(backBuffer); paint = new Paint(); paint.setColor(Color.BLUE); paint.setStrokeWidth(10); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStrokeJoin(Paint.Join.ROUND); } int lastX, lastY, currX, currY; boolean isDeleting; @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); int action = event.getAction(); switch(action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getX(); lastY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: if(isDeleting) break; currX = (int) event.getX(); currY = (int) event.getY(); cacheCanvas.drawLine(lastX, lastY, currX, currY, paint); lastX = currX; lastY = currY; break; case MotionEvent.ACTION_UP: if(isDeleting) isDeleting = false; break; case MotionEvent.ACTION_POINTER_DOWN: cacheCanvas.drawColor(Color.WHITE); // Back Buffer에 그려진 그림을 지운다 isDeleting = true; break; case MotionEvent.ACTION_POINTER_UP: break; } invalidate(); return true; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(clientHeight==0) { clientHeight = getClientHeight(); height = clientHeight; backBuffer = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888); cacheCanvas.setBitmap(backBuffer); } canvas.drawBitmap(backBuffer, 0, 0, null); //back buffer에 그려진 비트맵을 스크린 버퍼에 그린다 } /* 상태바, 타이틀바를 제외한 클라이언트 영역의 높이를 구한다 */ private int getClientHeight() { Rect rect= new Rect(); Window window = ((Activity)context).getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(rect); int statusBarHeight= rect.top; int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); int titleBarHeight= contentViewTop - statusBarHeight; return ((Activity)context).getWindowManager().getDefaultDisplay(). getHeight() - statusBarHeight - titleBarHeight; } }