标签:
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(); } } } } }; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/shaohx0518/article/details/46805769