android之刮刮卡中獎效果PorterDuffXfermode與paint屬性詳解

支付寶支付的時候有個中獎的的刮刮效果,現仿造做一個,效果如下:


直接上代碼,複製替換圖片就可以使用:每一段幾乎都有註釋,看着已經是比較明瞭了

   

package com.example.administrator.shapedropshadow;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * author : zhongwr on 2016/7/7
 */
public class PorterDuffXfermodeView extends View {

    /**
     * 圖層前景背景
     **/
    private Bitmap mBgBitmap, mFgBitmap;
    private Paint mPaint;
    /**
     * 記錄刮掉圖層的路徑,手勢劃過的路徑
     */
    private Path mPath;
    /**
     * 手勢劃過路徑的畫布
     **/
    private Canvas mCanvas;

    public PorterDuffXfermodeView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    /***
     * PorterDuffXfermode的屬性:
     * <p/>
     * 16條Porter-Duff規則
     * <p/>
     * 1.PorterDuff.Mode.CLEAR
     * <p/>
     * 所繪製不會提交到畫布上。
     * 2.PorterDuff.Mode.SRC
     * <p/>
     * 顯示上層繪製圖片
     * 3.PorterDuff.Mode.DST
     * <p/>
     * 顯示下層繪製圖片
     * 4.PorterDuff.Mode.SRC_OVER
     * <p/>
     * 正常繪製顯示,上下層繪製疊蓋。
     * 5.PorterDuff.Mode.DST_OVER
     * <p/>
     * 上下層都顯示。下層居上顯示。
     * 6.PorterDuff.Mode.SRC_IN
     * <p/>
     * 取兩層繪製交集。顯示上層。
     * 7.PorterDuff.Mode.DST_IN
     * <p/>
     * 取兩層繪製交集。顯示下層。
     * 8.PorterDuff.Mode.SRC_OUT
     * <p/>
     * 取上層繪製非交集部分。
     * 9.PorterDuff.Mode.DST_OUT
     * <p/>
     * 取下層繪製非交集部分。
     * 10.PorterDuff.Mode.SRC_ATOP
     * <p/>
     * 取下層非交集部分與上層交集部分
     * 11.PorterDuff.Mode.DST_ATOP
     * <p/>
     * 取上層非交集部分與下層交集部分
     * 12.PorterDuff.Mode.XOR
     * <p/>
     * <p/>
     * 13.PorterDuff.Mode.DARKEN
     * <p/>
     * <p/>
     * 14.PorterDuff.Mode.LIGHTEN
     * <p/>
     * <p/>
     * 15.PorterDuff.Mode.MULTIPLY
     * <p/>
     * <p/>
     * 16.PorterDuff.Mode.SCREEN
     */
    private void init() {
        mPaint = new Paint();
        //設置畫筆爲透明,Xfermode進行圖層計算時會計算透明通道值,纔會有顯示後面圖片背景的效果
        mPaint.setAlpha(0);
        //設置圖像合成:控制Paint如何與已有的Canvas圖像進行交互。Dst_IN是paint和已有的圖層的交集顯示上層的圖層,其它參考註釋
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        //畫筆不填充只描邊
        mPaint.setStyle(Paint.Style.STROKE);
        //消除鋸齒,否則邊界會有鋸齒形狀
        mPaint.setAntiAlias(true);
        //讓筆觸和連接處更加圓滑,顯示的是圓形
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        //畫筆寬度
        mPaint.setStrokeWidth(10);

        mPath = new Path();

        mBgBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.jgz);
        mFgBitmap = Bitmap.createBitmap(mBgBitmap.getWidth(), mBgBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        //創建了一個尺寸是mBgBitmap.getWidth*mBgBitmap.getHeight,使用它作爲Canvas操作的對象,或者說是創建一個內存,畫的操作都是在mFgBitmap(可當做畫布)上進行的
        mCanvas = new Canvas(mFgBitmap);//這時對此Canvas操作就是催mFgBitmap進行操作,mFgBitmap就當作是畫布
        mCanvas.drawColor(Color.GRAY);//將mFgBitmap畫成灰色

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
//                mPaint.reset();//恢復默認設置後,沒有設置alpha的畫筆會看不到圖片
                mPath.moveTo(event.getX(), event.getY());
                break;
            case MotionEvent.ACTION_MOVE:
                mPath.lineTo(event.getX(), event.getY());
                break;
        }
        mCanvas.drawPath(mPath, mPaint);
        invalidate();
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBgBitmap, 0, 0, null);
        canvas.drawBitmap(mFgBitmap, 0, 0, null);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章