PorterDuff.Mode详解

PorterDuff.Mode主要用于设置画笔模式,先贴上google官方ApiDemo的Graphics中Xfermode效果图:


首先,我们要知道Canvas是可以分层的,通过saveLayer方法我们可以在layer栈中新增一个layer,相应的通过restoreTo方法退栈,不懂的可以查相关资料,Layer主要有一下两点要注意:

  1. Layer入栈时,后续的DrawXXX操作都发生在这个Layer上
  2. Layer退栈时,会把本层绘制的图像“绘制”到上层或是Canvas(即最底层)上
由于 PorterDuff用于图层混合效果,首先我们创建了一个新的Layer,在新的Layer上应用PorterDuff效果,然后将Layer退栈,从而将效果图绘制到底层Canvas上,其中,DST_IN模式只显示目标区域(DST)和当前区域(SRC)重合的目标区域(DST)部分。

首先给出在新的Layer上绘制的效果图和直接在Canvas上绘制的效果图,很显然左面(绘制在Layer上)的效果是我们想要的



下面给出onDraw代码(绘制在Layer上效果只是多了两行红色的代码):

@Override

protected void onDraw(Canvas mCanvas) {

super.onDraw(mCanvas);

mCanvas.drawColor(Color.GREEN);

mCanvas.translate(200,200);

Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.timg);

Bitmap mask=Bitmap.createBitmap(300, 300, src.getConfig());

Canvas cc=new Canvas(mask);

cc.drawCircle(150,150,150,mPaint1);

int sc = mCanvas.saveLayer(0,0,300,300, null, Canvas.ALL_SAVE_FLAG);

mCanvas.drawBitmap(src, 0, 0, mPaint1);

mPaint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

mCanvas.drawBitmap(mask, 0, 0, mPaint1);

mPaint1.setXfermode(null);

mCanvas.restoreToCount(sc);

}

Ps:作为mask的bitmap应该大于或等于src_bitmap的大小,paint只能在绘制bitmap(mask)区域起作用,DST_OUT、DST_IN考虑到透明度



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值