Android 刮刮卡自定义view

原创 2015年07月08日 17:03:45
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class TextClear extends View {
    private boolean isMove = false;
    private Bitmap bitmap = null;
    private Bitmap frontBitmap = null;
    private Path path;
    private Canvas mCanvas;
    private Paint paint;
    private Thread mSweapThread;
    private boolean isThreadStart = false;
    private OnTextClearListener mOnTextClearListener;
    private TextClear mTextClear;
    private boolean mComplete = false;

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

    public TextClear(Context context) {
        super(context);
    }

    /**
     * 重置刮奖图层
     */
    public void resetting() {
        mCanvas = null;
        path = null;
        isThreadStart = false;
        mComplete = false;
        invalidate();
        mTextClear.setVisibility(View.VISIBLE);
    }

    public void setOnTextClearListener(OnTextClearListener listener, TextClear textClear) {
        mOnTextClearListener = listener;
        mTextClear = textClear;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (mCanvas == null) {
            EraseBitmp();
        }
        canvas.drawBitmap(bitmap, 0, 0, null);
        mCanvas.drawPath(path, paint);
        super.onDraw(canvas);
    }

    public void EraseBitmp() {
        bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
        frontBitmap = CreateBitmap(Color.GRAY, getWidth(), getHeight());
        paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
        paint.setAntiAlias(true);
        paint.setDither(true);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStrokeWidth(40);
        path = new Path();
        mCanvas = new Canvas(bitmap);
        mCanvas.drawBitmap(frontBitmap, 0, 0, null);
        mSweapThread = new Thread(mRunnable);
        //图层初始化回调
        if (mOnTextClearListener != null) {
            mOnTextClearListener.preStratchInitListener(mTextClear);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float ax = event.getX();
        float ay = event.getY();
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            isMove = false;
            path.reset();
            path.moveTo(ax, ay);
            invalidate();
            return true;
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            isMove = true;
            path.lineTo(ax, ay);
            invalidate();
            return true;
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            if (!isThreadStart) {
                mSweapThread.start();
                isThreadStart = true;
                //开始刮回调
                if (mOnTextClearListener != null) {
                    mOnTextClearListener.onStratchStartListener(mTextClear);
                }
            }
        }
        return super.onTouchEvent(event);
    }

    public Bitmap CreateBitmap(int color, int width, int height) {
        LogGloble.d("color", color + "");
        int[] rgb = new int[width * height];

        for (int i = 0; i < rgb.length; i++) {
            rgb[i] = color;
        }
        return Bitmap.createBitmap(rgb, width, height, Config.ARGB_8888);
    }

    //刮奖完成回调接口
    public interface OnTextClearListener {
        /**
         * 监听刮刮卡图层初始化
         */
        public void preStratchInitListener(TextClear textClear);

        /**
         * 监听刮的动作开始
         */
        public void onStratchStartListener(TextClear textClear);

        /**
         * 监听刮刮乐完成
         */
        public void onStratchCompleteListenner(TextClear textClear);

    }

    private Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            while (!mComplete) {
                int w = bitmap.getWidth();
                int h = bitmap.getHeight();
                float wipeArea = 0;
                float totalArea = w * h;
                int[] mPixels = new int[w * h];
                bitmap.getPixels(mPixels, 0, w, 0, 0, w, h);
                for (int i = 0; i < w; i++) {
                    for (int j = 0; j < h; j++) {
                        int index = i + j * w;
                        if (mPixels[index] == 0) {
                            wipeArea++;
                        }
                    }
                }
                if (wipeArea > 0 && totalArea > 0) {
                    int percent = (int) (wipeArea * 100 / totalArea);
                    LogGloble.e("percent", percent + "");
                    if (percent > 60) {
                        mComplete = true;
                        if (mOnTextClearListener != null) {
                            mOnTextClearListener.onStratchCompleteListenner(mTextClear);
                        }
                        postInvalidate();
                    }
                }
            }

        }
    };
}

自定义View--刮刮卡

效果图: 原理:最上层是一个(颜色值为#cococo)bitmap,中间是一个画笔在画布上花下用户滑动的路径,最下层是一个背景图片的bitmap(见下图) 具体绘制的代码如下: @Overri...
  • qq_30716173
  • qq_30716173
  • 2016年04月12日 10:57
  • 2126

android 自定义View之刮刮卡

看了徐宜生的《android群英传》学习到了很多知识,一遍肯定是不够的,粗看一遍后仔细品味,发现每次读的时候看到的东西都不一样,感谢徐宜生的无私奉献,让我们这些小白能快速成长。 刮刮卡一般有...
  • qq_24531461
  • qq_24531461
  • 2017年01月15日 17:47
  • 202

Android 自定义控件实现刮刮卡效果 真的就只是刮刮卡么

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40162163 , 本文出自:【张鸿洋的博客】很久以前也过一个html5的刮刮卡效...
  • lmj623565791
  • lmj623565791
  • 2014年10月27日 09:33
  • 43403

Android自定义View——刮刮卡效果

刮刮卡效果 效果图: 想要红包的实现效果的可以关注我的博客仿饿了么红包 实现原理: 下层为我们的红包图片 上层为我们灰色的颜色 使用滑动监听,滑动时,用透明度为0的画笔画出透明...
  • qq_30379689
  • qq_30379689
  • 2016年10月11日 14:48
  • 1782

Android自定义View之刮刮卡效果

Android自定义View之刮刮卡效果
  • u010670151
  • u010670151
  • 2016年04月13日 16:46
  • 253

自定义view刮刮卡效果

要实现这种效果,必须要知道这样一个类 PorterDuffXfermode,设置两张图片重叠的效果 他有以下过滤模式:(SRC:ImageView 的src ;DST:ImageView的Back...
  • qq_31116683
  • qq_31116683
  • 2016年05月12日 17:19
  • 227

自定义View(一)——画线、矩形、圆形、图像

一、最简单的自定义View,什么都不显示,但是有View的特性 com.cctvjiatao.customview.MainActivity package com.cctvjiatao.custom...
  • lvyoujt
  • lvyoujt
  • 2016年03月12日 13:29
  • 4465

Android自定义View(二、深入解析自定义属性)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51454685 本文出自:【openXu的博客】 [TOC] 在上一篇博...
  • u010163442
  • u010163442
  • 2016年05月21日 03:53
  • 17688

Android自定义View的实现方法,带你一步步深入了解View(四)

不知不觉中,带你一步步深入了解View系列的文章已经写到第四篇了,回顾一下,我们一共学习了LayoutInflater的原理分析、视图的绘制流程、视图的状态及重绘等知识,算是把View中很多重要的知识...
  • sinyu890807
  • sinyu890807
  • 2014年01月23日 08:32
  • 139983

Android自定义view生命周期

定义一个自定义CustomView,在xml中加载,打印MainActivity和view各个生命周期方法,对比如图显示       自定义view的生命周期过程主要分为三个环节,初始准备...
  • ljzdyh
  • ljzdyh
  • 2016年07月26日 15:08
  • 2396
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 刮刮卡自定义view
举报原因:
原因补充:

(最多只允许输入30个字)