編輯:關於Android編程
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();
}
}
}
}
};
}
微信朋友圈紅點開啟關閉教程
經常玩手機的朋友都知道。微信朋友圈是是我們經常逛的地方,大家知道只要微信朋友圈有消息更新,我們微信界面上就會相信一個紅點提示,有強迫症的朋友可能就著急了,下
對Android opengl ES世界坐標系和紋理坐標系的理解
初學opengl ES,每一個教你在屏幕上貼圖的opengl版hello world都有這麼兩數組: static final float COORD[] = {
Android自定義DataTimePicker實例代碼(日期選擇器)
筆者有一段時間沒有發表關於Android的文章了,關於Android自定義組件筆者有好幾篇想跟大家分享的,後期會記錄在博客中。本篇博客給大家分享的是自定義一個日期選擇器,
安卓Android輕松完成支付寶支付教程
介紹參考安卓Dialog源碼,他的builder設計模式實現方式是,使用內部類來實現功能,外部類的作用是通過build()函數,來對內部類進行參數設置,例如setter方