Android/DrawingBoard demo

Android DrawingBoard demo

Soul-Learner 2012. 8. 16. 12:14

안드로이드에서 Double Buffering과 터치 이벤트로 그림 그리기

그려진 그림을 멀티터치 이벤트로 지우는 기능은 여기를 참조하세요

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)); } }


DrawingBoard.java

package com.example.androidapp; 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.util.AttributeSet; import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; public class DrawingBoard extends View { Canvas cacheCanvas; Bitmap backBuffer; int width, height; Paint paint;

int lastX, lastY, currX, currY; public DrawingBoard(Context context) { super(context); init(); } public DrawingBoard(Context context, AttributeSet attrs) { super(context, attrs); 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); } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); int action = event.getAction(); switch(action) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getX(); lastY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: currX = (int) event.getX(); currY = (int) event.getY(); cacheCanvas.drawLine(lastX, lastY, currX, currY, paint); lastX = currX; lastY = currY; break; case MotionEvent.ACTION_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; } }