PorterDuff.Mode详解

来源:互联网 发布:windows snmp测试工具 编辑:程序博客网 时间:2024/05/22 13:47

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
原创粉丝点击