Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 刮刮卡自定義view

Android 刮刮卡自定義view

編輯:關於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();
                    }
                }
            }

        }
    };
}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved