关闭

Android 刮刮卡自定义view

926人阅读 评论(38) 收藏 举报
分类:
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();
                    }
                }
            }

        }
    };
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:78487次
    • 积分:1421
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:7篇
    • 译文:0篇
    • 评论:114条
    博客专栏
    文章分类
    最新评论