废话少说,直接贴代码,希望对大家有帮助。
public class DrawView extends View{ private Canvas pcanvas; private Paint paint; private Path path; private Bitmap originBitmap; private Bitmap pureBitmp; private Bitmap bitmapBuff; private float scaleWidth; private float scaleHeight; private float downx = 0,downy = 0; public DrawView(Context context) { super(context); setBackgroundResource(R.drawable.pic); path = new Path(); paint = new Paint(); paint.setAlpha(0); paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); paint.setAntiAlias(true); paint.setDither(true); paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStrokeWidth(15.6f); initLayer(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(path, paint); canvas.drawBitmap(bitmapBuff, 0, 0, null); } private void initLayer(Context context){ InputStream stream = context.getResources().openRawResource(R.drawable.layer); originBitmap = BitmapFactory.decodeStream(stream); int width = originBitmap.getWidth(); int height = originBitmap.getHeight(); Display currentDisplay = ((Activity)context).getWindowManager().getDefaultDisplay(); float newWidth = currentDisplay.getWidth(); float newHeight = currentDisplay.getHeight(); 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); pcanvas = new Canvas(bitmapBuff); pcanvas.drawBitmap(pureBitmp, 0, 0, null); } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: downx = event.getX(); downy = event.getY(); path.reset(); path.moveTo(downx, downy); break; case MotionEvent.ACTION_MOVE: float upx = event.getX(); float upy = event.getY(); touchMove(upx, upy); invalidate(); break; case MotionEvent.ACTION_UP: pcanvas.drawPath(path, paint); path.reset(); invalidate(); break; case MotionEvent.ACTION_CANCEL: break; default: break; } return true; } private void touchMove(float upx, float upy){ float dx = Math.abs(downx-upx); float dy = Math.abs(downy-upy); if (dx >= 4 || dy >= 4) { path.quadTo(downx, downy, (downx + upx)/2, (downy + upy)/2); downx = upx; downy = upy; } } }