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);
    }
}

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