返回首页
当前位置: 主页 > 网络编程 > Android教程 >

通过Android自定义View实现刮刮乐抽奖效果

时间:2019-11-21 14:11来源:知行网www.zhixing123.cn 编辑:麦田守望者

 本文将为大家介绍如何在安卓开发中如何通过自定义View实现刮刮乐抽奖效果,代码如下:

1.package com.netease.paint.xfermode;
2.
3.import android.content.Context;
4.import android.graphics.Bitmap;
5.import android.graphics.BitmapFactory;
6.import android.graphics.Canvas;
7.import android.graphics.Color;
8.import android.graphics.Paint;
9.import android.graphics.Path;
10.import android.graphics.PorterDuff;
11.import android.graphics.PorterDuffXfermode;
12.import android.util.AttributeSet;
13.import android.view.MotionEvent;
14.import android.view.View;
15.
16.public class XfermodeEraserView extends View {
17.
18.    private Paint  mPaint;
19.    private Bitmap mDstBmp, mSrcBmp, mTxtBmp;
20.    private Path mPath;
21.
22.    public XfermodeEraserView(Context context) {
23.        this(context, null);
24.    }
25.
26.    public XfermodeEraserView(Context context, AttributeSet attrs) {
27.        this(context, attrs, 0);
28.    }
29.
30.    public XfermodeEraserView(Context context, AttributeSet attrs, int defStyleAttr) {
31.        super(context, attrs, defStyleAttr);
32.        init();
33.    }
34.
35.    private void init() {
36.        //初始化画笔
37.        mPaint = new Paint();
38.        mPaint.setColor(Color.RED);
39.        mPaint.setStyle(Paint.Style.STROKE);
40.        mPaint.setStrokeWidth(80);
41.
42.        //禁用硬件加速
43.        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
44.
45.        //初始化图片对象
46.        mTxtBmp = BitmapFactory.decodeResource(getResources(), R.drawable.result);
47.        mSrcBmp = BitmapFactory.decodeResource(getResources(), R.drawable.eraser);
48.        mDstBmp = Bitmap.createBitmap(mSrcBmp.getWidth(), mSrcBmp.getHeight(), Bitmap.Config.ARGB_8888);
49.
50.        //路径(贝塞尔曲线)
51.        mPath = new Path();
52.    }
53.
54.
55.    @Override
56.    protected void onDraw(Canvas canvas) {
57.        super.onDraw(canvas);
58.
59.        //绘制刮奖结果
60.        canvas.drawBitmap(mTxtBmp, 0, 0, mPaint);
61.
62.        //使用离屏绘制
63.        int layerID = canvas.saveLayer(0, 0, getWidth(), getHeight(), mPaint, Canvas.ALL_SAVE_FLAG);
64.
65.        //先将路径绘制到 bitmap上
66.        Canvas dstCanvas = new Canvas(mDstBmp);
67.        dstCanvas.drawPath(mPath, mPaint);
68.
69.        //绘制 目标图像
70.        canvas.drawBitmap(mDstBmp, 0, 0, mPaint);
71.        //设置 模式 为 SRC_OUT, 擦橡皮区域为交集区域需要清掉像素
72.        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
73.        //绘制源图像
74.        canvas.drawBitmap(mSrcBmp, 0, 0, mPaint);
75.        //清楚原图
76.        mPaint.setXfermode(null);
77.
78.        canvas.restoreToCount(layerID);
79.    }
80.
81.    private float mEventX, mEventY;
82.
83.    @Override
84.    public boolean onTouchEvent(MotionEvent event) {
85.        super.onTouchEvent(event);
86.        switch (event.getAction()) {  //监听触摸事件
87.            case MotionEvent.ACTION_DOWN:
88.                mEventX = event.getX();
89.                mEventY = event.getY();
90.                mPath.moveTo(mEventX, mEventY);
91.                break;
92.            case MotionEvent.ACTION_MOVE:
93.                float endX = (event.getX() - mEventX) / 2 + mEventX;
94.                float endY = (event.getY() - mEventY) / 2 + mEventY;
95.                //画二阶贝塞尔曲线
96.                mPath.quadTo(mEventX, mEventY, endX, endY);
97.                mEventX = event.getX();
98.                mEventY = event.getY();
99.                break;
100.        }
101.        invalidate();
102.        return true; //消费事件
103.    }
104.
105.}
------分隔线----------------------------
标签(Tag):
------分隔线----------------------------
推荐内容
猜你感兴趣