仿刮刮乐刮奖效果

该功能实现很简单,就是根据手指坐标位置在画板上画

1.效果图

2.代码实现

public class ErinieShow extends RelativeLayout {  
    Context context;  
    RelativeLayout bg;  
    MyView MyView;  
 int level;  
 public ErinieShow(Context context, int level) {  
 super(context);  
 this.context = context;  
 this.level = level;  
 
        bg = new RelativeLayout(context);  
        MyView = new MyView(context);  
        bg.addView(MyView);  
        addView(bg);  
 
 int[] resolution = PhoneUtil.getResolution(context);  
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(  
                resolution[0], PhoneUtil.getFitHeight(context, 125));  
 
        bg.setId(100001);  
        bg.setLayoutParams(params);  
        MyView.setLayoutParams(params);  
 
 switch (level) {  
 case 0:  
            bg.setBackgroundResource(R.drawable.rewardlevel0);  
 break;  
 case 1:  
            bg.setBackgroundResource(R.drawable.rewardlevel1);  
 
 break;  
 case 2:  
            bg.setBackgroundResource(R.drawable.rewardlevel2);  
 break;  
 default:  
            bg.setBackgroundResource(R.drawable.rewardlevel3);  
 break;  
        }  
 
        MyView.init(Color.parseColor("#d3d3d3"), 30, 10);  
    }  
}  
public class MyView extends TextView {  
 
 private float TOUCH_TOLERANCE; // 填充距离,使线条更自然,柔和,值越小,越柔和。 
 private Bitmap mBitmap;  
 private Canvas mCanvas;  
 private Paint mPaint;  
 private Path mPath;  
 private float mX, mY;  
 private boolean isDraw = false;  
 int time=0;  
 
 public MyView(Context context) {  
 super(context);  
    }  
 
 @Override 
 protected void onDraw(Canvas canvas) {  
 super.onDraw(canvas);  
 if (isDraw) {  
            mCanvas.drawPath(mPath, mPaint);  
            canvas.drawBitmap(mBitmap, 0, 0, null);  
        }  
    }  
 
 /** 
     * 开启檫除功能 
     *  
     * @param bgColor 
     *            覆盖的背景颜色 
     * @param paintStrokeWidth 
     *            触点(橡皮)宽度 
     * @param touchTolerance 
     *            填充距离,值越小,越柔和。 
     */ 
 public void init(final int bgColor, final int paintStrokeWidth,  
 float touchTolerance) {  
        TOUCH_TOLERANCE = touchTolerance;  
 // 设置画笔 
        mPaint = new Paint();  
 // mPaint.setAlpha(0); 
 // 画笔划过的痕迹就变成透明色了 
        mPaint.setColor(Color.BLACK); // 此处不能为透明色 
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));  
 // 或者 
 // mPaint.setAlpha(0); 
 // mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
 
        mPaint.setAntiAlias(true);  
        mPaint.setDither(true);  
        mPaint.setStyle(Paint.Style.STROKE);  
        mPaint.setStrokeJoin(Paint.Join.ROUND); // 前圆角 
        mPaint.setStrokeCap(Paint.Cap.ROUND); // 后圆角 
        mPaint.setStrokeWidth(paintStrokeWidth); // 笔宽 
 
 // 痕迹 
        mPath = new Path();  
 // 覆盖 
        LayoutParams layoutParams = getLayoutParams();  
 int height = layoutParams.height;  
 int width;  
 if (getLayoutParams().width == LayoutParams.MATCH_PARENT) {  
            width = 700;  
        } else {  
            width = layoutParams.width;  
        }  
 
        mBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);  
        mCanvas = new Canvas(mBitmap);  
 
        mCanvas.drawColor(bgColor);  
        isDraw = true;  
    }  
 
 @Override 
 public boolean onTouchEvent(MotionEvent event) {  
 if (!isDraw) {  
 return true;  
        }  
 switch (event.getAction()) {  
 case MotionEvent.ACTION_DOWN: // 触点按下 
 // touchDown(event.getRawX(),event.getRawY()); 
            touchDown(event.getX(), event.getY());  
            invalidate();  
 break;  
 case MotionEvent.ACTION_MOVE: // 触点移动 
            touchMove(event.getX(), event.getY());  
            invalidate();  
 break;  
 case MotionEvent.ACTION_UP: // 触点弹起 
            touchUp(event.getX(), event.getY());  
            invalidate();  
 break;  
 default:  
 break;  
        }  
 return true;  
    }  
 
 private void touchDown(float x, float y) {  
        mPath.reset();  
        mPath.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) {  
            mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);  
            mX = x;  
            mY = y;  
        }  
 
    }  
 
 private void touchUp(float x, float y) {  
        mPath.lineTo(x, y);  
        mCanvas.drawPath(mPath, mPaint);  
        mPath.reset();  
    }  
 
}  

源码下载http://download.csdn.net/detail/strawberry2013/7682865

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

PullToRefreshScrollView 嵌套RecyclerView实现特卖列表倒计时抢购

不久之前,我们谈到了通过Handler与timer及TimerTask结合实现倒计时抢购列表,那个是PullToRefreshListView实现的,今天要讲的...

35050
来自专栏Android开发指南

Android刮刮卡自定义控件

39790
来自专栏Android干货

Android项目实战(二十):浅谈ListView悬浮头部展现效果

40850
来自专栏Android先生

让你的Dialog变得更简洁一点吧

用Builder模式重新打造一个dialog,案例中有两种Builder,分别是CommonBuilder和MDBuilder,如果还想实现其他的通用,继承自F...

10530
来自专栏向治洪

Android仿拼多多拼团堆叠头像

序言 做电商的都知道,作为商品的一种售卖方式,拼团是是提供商品售卖的一种及时有效的方式,而在拼团市场中,拼多多无疑是做的最好的一家。于是,研究拼多多的售卖方式之...

23660
来自专栏向治洪

Android仿拼多多拼团堆叠头像

序言 做电商的都知道,作为商品的一种售卖方式,拼团是是提供商品售卖的一种及时有效的方式,而在拼团市场中,拼多多无疑是做的最好的一家。于是,研究拼多多的售卖方式之...

61080
来自专栏Android干货

安卓开发_慕课网_百度地图_刮刮涂层效果

374140
来自专栏Android学习之路

自定义圆形图片控件

19690
来自专栏Android知识点总结

Android触摸事件实现笔触画布

19630
来自专栏一“技”之长

Android开发之AbsoluteLayout绝对布局

        AbsoluteLayout绝对布局已经被弃用,但是相关API依然有效,其又被称为坐标布局,在iOS开发支持Autolayout之前,所有的布局...

10330

扫码关注云+社区

领取腾讯云代金券