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