标签:
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