Mega Code Archive

 
Categories / Android / 2D Graphics
 

Finger Paint View

//package com.aflyroc.doodle.view; import java.io.InputStream; import java.util.ArrayList; import java.util.List; 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.Path; import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.Paint.FontMetrics; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class FingerPaintView extends View {   Path path;   Bitmap bitmapBuff;   Paint paint;   Paint pen;   Canvas canvas;   Bitmap originBitmap;   Bitmap pureBitmp;   private float scaleWidth;   private float scaleHeight;   private float mX,mY;   private static float TOUCH_TOLERANCE = 4;   private Canvas printCanvas;   Bitmap printBitmapBuff;   private List<Path> pathList;   int i = 0;   public FingerPaintView(Context context, AttributeSet attrs) {     super(context, attrs);     loadBitmap(context);     Log.i("Context context, AttributeSet attrs", "11");   }   public FingerPaintView(Context context) {     super(context);     loadBitmap(context);     Log.i("Context context", "222");   }   public void loadBitmap(Context context) {          pathList = new ArrayList<Path>();     path = new Path();     paint = new Paint();     paint.setAntiAlias(true);     paint.setDither(true);     paint.setColor(Color.RED);     paint.setStyle(Paint.Style.STROKE);     paint.setStrokeJoin(Paint.Join.ROUND);     paint.setStrokeCap(Paint.Cap.ROUND);     paint.setStrokeWidth(1.6f);          InputStream stream = null;//getResources().openRawResource(drawable.precheck);     originBitmap = BitmapFactory.decodeStream(stream);     int width = originBitmap.getWidth();     int height = originBitmap.getHeight();          DisplayMetrics metrics = context.getApplicationContext().getResources().getDisplayMetrics();      int newWidth = metrics.widthPixels;          int newHeight = metrics.heightPixels;     // Â¼ÆËãËõ·ÅÂʣ¬³ß´ç³ýԭʼ³ßÂ´ç     scaleWidth = ((float) newWidth / width);          scaleHeight = ((float) newHeight / height);     Matrix matrix = new Matrix();     matrix.postScale(scaleWidth, scaleHeight);     pureBitmp = Bitmap.createBitmap(originBitmap, 0, 0, width, height,matrix, true);     bitmapBuff = Bitmap.createBitmap(pureBitmp.getWidth(),pureBitmp.getHeight(), Bitmap.Config.ARGB_8888);          canvas = new Canvas(bitmapBuff);     canvas.drawBitmap(pureBitmp, 0, 0, paint);   }   public boolean onTouchEvent(MotionEvent event) {     float x = event.getX();     float y = event.getY();     switch (event.getAction()) {     case MotionEvent.ACTION_DOWN:       touchStart(x, y);       invalidate();       break;     case MotionEvent.ACTION_MOVE:       touchMove(x, y);       invalidate();       break;     case MotionEvent.ACTION_UP:       touchUp(x, y);       invalidate();       break;     }     return true;   }   protected void onDraw(Canvas canvas) {     super.onDraw(canvas);     // »æÖƼñ     canvas.drawBitmap(bitmapBuff, 0, 0, paint);     // »æÖƼΠ    canvas.drawPath(path, paint);   }   private void touchStart(float x, float y)   {     path.reset();     path.moveTo(x, y);     mX = x;     mY=y;        }   private void touchMove(float x,float y)   {     float dx = Math.abs(x-mX);     float dy = Math.abs(y-mY);     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {       path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);             mX = x;             mY = y;                      }   }   private void touchUp(float x,float y)   {     pathList.add(new Path(path));          canvas.drawPath(path,paint);          path.reset();   }   public void createPrintCanvas()   {     Bitmap printBitmap = Bitmap.createBitmap(originBitmap);          printBitmapBuff = Bitmap.createBitmap(printBitmap.getWidth(),printBitmap.getHeight(), Bitmap.Config.ARGB_8888);          Matrix matrix = new Matrix();     matrix.postScale(1/scaleWidth, 1/scaleHeight);          printCanvas = new Canvas(printBitmapBuff);          printCanvas.drawBitmap(printBitmap, 0, 0, paint);          for(int i=0;i<pathList.size();i++)     {       Path tempPath = new Path(pathList.get(i));              tempPath.transform(matrix);              printCanvas.drawPath(tempPath, paint);              Log.d("path", tempPath.toString());            }          printCanvas.save();   }   public float getScaleWidth() {     return scaleWidth;   }   public float getScaleHeight() {     return scaleHeight;   } }