刮刮卡效果

来源:互联网 发布:淘宝的香港通利琴行 编辑:程序博客网 时间:2024/05/22 03:42
package com.app.yunrich.myapplication;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.PixelXorXfermode;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.Xfermode;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;/** * Created by Administrator on 2016/5/13. */public class XOR extends View {    Paint paint;    Bitmap src;    Path mask;    Canvas bpaint;    public XOR(Context context) {        super(context);    }    public XOR(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public XOR(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    Bitmap d;    public void init(){        d = BitmapFactory.decodeResource(getResources(),R.drawable.main);        src = Bitmap.createBitmap(d.getWidth(),d.getHeight(), Bitmap.Config.ARGB_8888);        mask = new Path();        bpaint = new Canvas(src);        bpaint.drawBitmap(d,0,0,new Paint());        bpaint.drawColor(Color.GRAY);        paint = new Paint();        paint.setStrokeWidth(24);        paint.setStyle(Paint.Style.STROKE);        paint.setAlpha(0);        //paint.setColor(Color.RED);        PorterDuffXfermode xfermode1 = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);        paint.setXfermode(xfermode1);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        float x = event.getX();        float y = event.getY();        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                mask.reset();                mask.moveTo(x,y);                break;            case MotionEvent.ACTION_MOVE:                mask.lineTo(x,y);                bpaint.drawPath(mask,paint);                break;            case MotionEvent.ACTION_UP:                break;        }        invalidate();        return true;    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.drawBitmap(d,0,0,null);        canvas.drawBitmap(src, 0,0,null);    }}


代码如上.

原理:实现擦除效果需要一个蒙版,将蒙版遮盖在原图上,就可以实现刮刮乐了

重点在蒙版的实现:

1、创建一个画布,并设置成灰色

2、记录轨迹path,并利用混合效果使得path 记录的地方经过运算alpha通道为0,(DST_IN 和ALPHA =0)

paint.setAlpha(0);PorterDuffXfermode xfermode1 = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);

0 0
原创粉丝点击