Android刮彩票效果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31848763/article/details/51775078

这里写图片描述

实现分析:
1.底部一张图片
2.图片头部是一个矩形遮挡图片
3.通过滑动监听,让矩形缺失,露出底部图片

这里写图片描述
主要代码如下:


    private RectF rectf;
    private Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
            R.drawable.test);
    //头部
    private Canvas headCanvas;
    private int width;
    private int height;
    // 开始绘制Path坐标
    private float startX;
    private float startY;
    // 用来绘制划过的路径
    private Path path = new Path();
    // 划过多大距离开始绘制划过的路径
    private static final int DIS = 20;
    // 画笔
    private Paint paint;
    // 画笔size
    private int paintSize = 20;

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        width = getWidth();
        height = getHeight();
        paintSize = height / 5;
        rectf = new RectF(0, 0, width, height);
        // 底部的文字
        canvas.drawBitmap(bitmap, null, rectf, null);
        // 挡住底部文字
        canvas.drawBitmap(drawHead(), null, rectf, null);
    }

    // 头部的图层
    private Bitmap drawHead() {
        Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
        headCanvas = new Canvas(bitmap);
        RectF rectF = new RectF(0, 0, width, height);
        paint = new Paint();
        paint.setColor(Color.BLACK);
        // 画一个矩阵挡住底部
        headCanvas.drawRect(rectF, paint);
        /*
         * 设置图层混合模式 Mode.SRC_OUT:在不相交的地方绘制 源图像
         */
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
        paint.setAlpha(0);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(paintSize);
        /*
         * 设置画笔的形状
         */
        paint.setStyle(Paint.Style.STROKE);
        // 前圆角
        paint.setStrokeJoin(Paint.Join.ROUND);
        // 后圆角
        paint.setStrokeCap(Paint.Cap.ROUND);
        // 绘制滑动路径
        headCanvas.drawPath(path, paint);
        return bitmap;
    }

    // 刷新
    public void setRefresh() {
        // 清除路径
        path.rewind();
        invalidate();
    }

    // 切换图片
    public void setImage(Bitmap bitmap) {
        path.rewind();
        this.bitmap = bitmap;
        invalidate();
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            startX = event.getX();
            startY = event.getY();
            // 移动起点
            path.moveTo(startX, startY);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            float differenceX = Math.abs(event.getX() - startX);
            float differenceY = Math.abs(event.getY() - startY);
            if (differenceX >= DIS || differenceY >= DIS) {
                /*
                 * 参数1,2:为控制点 参数3,4:为结束点
                 */
                path.quadTo(startX, startY, event.getX(), event.getY());
                startX = event.getX();
                startY = event.getY();
            }
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            break;
        default:
            break;
        }

        return true;
    }

源码下载

猜你喜欢

转载自blog.csdn.net/qq_31848763/article/details/51775078