PorterDuffXfermode实现刮刮卡效果

本文介绍了一种自定义View的方法,通过继承View并利用PorterDuffXfermode实现特殊的绘图效果。该View可以响应触摸事件,并在触摸区域内擦除背景图片,展示出擦除效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//自定义view继承view

 public class XfermodeView extends View {

private Context context;
private Path path;
private Canvas mcanvas;
private Paint mpanit;
private Bitmap bgBitmap;
private Bitmap fgBitmap;

public XfermodeView(Context context) {
    this(context, null);
}

public XfermodeView(Context context, AttributeSet attrs) {
    super(context, attrs);
   // this.context=context;
    initView();
}

private void initView() {
    mpanit = new Paint();
    mpanit.setAlpha(0);//透明度设置为0显示檫除效果,
    //portduff进行图层混合时也会计算透明通道的值,混合后会显示底层的图片
    mpanit.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    //使用dis_in模式将路径绘制到到前面覆盖的图层上面
    mpanit.setStyle(Paint.Style.STROKE);
    mpanit.setStrokeWidth(50);
    mpanit.setStrokeCap(Paint.Cap.ROUND);//让笔触连接处圆滑
    mpanit.setStrokeJoin(Paint.Join.ROUND);//让笔触连接处圆滑
    path = new Path();
    bgBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.lock_screen_houma);//设置背景图片
    fgBitmap = Bitmap.createBitmap(bgBitmap.getWidth(), bgBitmap.getHeight(), Bitmap.Config.ARGB_8888);
    mcanvas = new Canvas(fgBitmap);//根据背景图片绘制灰色区域
    mcanvas.drawColor(Color.GRAY);//设置画布颜色
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            path.reset();
            path.moveTo(event.getX(), event.getY());
            break;
        case MotionEvent.ACTION_MOVE:
            path.lineTo(event.getX(), event.getY());//绘制线条
            break;

    }
    mcanvas.drawPath(path, mpanit);
    invalidate();
    return true;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(bgBitmap,0,0,null);//默认画笔绘制背景
    canvas.drawBitmap(fgBitmap,0,0,null);//绘制灰色区域

}

}
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值