Android 画图之刮刮乐效果

来源:互联网 发布:知乎周刊plus网盘 编辑:程序博客网 时间:2024/05/29 18:15
 刮刮乐效果实现起来代码量不多,很简单。
 主要是理解PorterDuffXfermode,它是一种集合概念,交集、并集等图像的混合显示模式。
 需要注意的是两个图层交集区域的显示  方式,dst是先画的图形,src是后画的图形。
 这里使用DST_IN模式将贝塞尔曲线路径绘制钱面覆盖的图层即可。 

直接上源码 就一个自定义ImageView类
public class XfermodeView extends ImageView{
private Bitmap mBgBitmap,mFgBitmap;
private Paint mPaint;
private Canvas mCanvas;
private Path mPath;

public XfermodeView(Context context,AttributeSet attrs) {
super(context,attrs);
init();
}

private void init() {
mPaint=new Paint();
mPaint.setAlpha(0);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeWidth(50);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPath=new Path();
Drawable drawable =getDrawable();
mBgBitmap=((BitmapDrawable)drawable).getBitmap();
mFgBitmap=Bitmap.createBitmap(mBgBitmap.getWidth(),mBgBitmap.getHeight(),Bitmap.Config.ARGB_8888);
mCanvas=new Canvas(mFgBitmap);
mCanvas.drawColor(Color.GRAY);
  }
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPath.reset();
mPath.moveTo(event.getX(), event.getY());
break;
case MotionEvent.ACTION_MOVE:
mPath.lineTo(event.getX(), event.getY());
break;
}
mCanvas.drawPath(mPath, mPaint);
invalidate();
return true;
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mBgBitmap, 0, 0,null);
canvas.drawBitmap(mFgBitmap, 0, 0,null);
}
}
2 0
原创粉丝点击