日积月累。
还在学习中,今天学习了一个使用自定义View做的刮刮卡的效果,写篇博客分享一下,写的不好请各位大佬谅解
直接进入主题。
自定义控件嘛还是那一套,先创建一个cardview,继承view,实现构造方法。看代码
public class ScratchCard extends View{ //画笔 private Paint paint; private Path path; //背景图 private Bitmap bgbitmap; //上层的灰色涂层 private Bitmap fgbitmap; private Canvas canvas; public ScratchCard(Context context) { super(context); initPaint(); } public ScratchCard(Context context, @Nullable AttributeSet attrs) { super(context, attrs); initPaint(); } public ScratchCard(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private void initPaint(){ paint = new Paint(); paint.setAlpha(0); //显示在背景图层上 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); //绘制的时候遵循paint的设置 paint.setStyle(Paint.Style.STROKE); //手势拐角设置为圆 paint.setStrokeJoin(Paint.Join.ROUND); //手势结束设置为圆 paint.setStrokeCap(Paint.Cap.ROUND); //刮的范围 paint.setStrokeWidth(20); path = new Path(); //设置底层图片 bgbitmap = BitmapFactory.decodeResource(getResources(), R.drawable.nan); //根据底部图片大小设置上层涂层颜色 fgbitmap = Bitmap.createBitmap(bgbitmap.getWidth(), bgbitmap.getHeight(), Bitmap.Config.ARGB_8888); canvas = new Canvas(fgbitmap); canvas.drawColor(Color.parseColor("#999999")); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //绘制背景图层 canvas.drawBitmap(bgbitmap,0,0,null); //绘制遮罩图层 canvas.drawBitmap(fgbitmap,0,0,null); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: path.reset(); path.moveTo(event.getX(),event.getY()); //实现点击擦除 path.lineTo(event.getX(),event.getY()); break; case MotionEvent.ACTION_MOVE: //手势画线 path.lineTo(event.getX(),event.getY()); break; case MotionEvent.ACTION_UP: break; } canvas.drawPath(path,paint); invalidate(); return true; } }
代码中注释写的还算清楚,都是我自己查的,能弄懂都是啥意思。第一次写这个,还不太熟,慢慢学。
效果如下:
图有点小,如果觉得妹纸不好看,你自己可以换一个,想要哪个要哪个。
日积月累