在官方文档中PorterDuffXferMode的效果是这样的
然而实际上当dst和src都不是bitmap的时候,效果是这样的
所以使用PorterDuffXferMode是有条件的,条件如下
1.dst和src都是bitmap。
2.绘制的图层背景必须是透明的
结论参考自http://www.myexception.cn/mobile/2059725.html,该文章有具体的分析过程。不过经过本人实验,该文章也有不正确的地方,比如硬件加速关不关闭并不影响,bitmap大小和背景色并不影响。需要注意的应该是绘制图层应该是透明的图层。
本人是这样写的
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//新建一个图层,新建的图层背景是透明的
int layerId = canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),null, Canvas.ALL_SAVE_FLAG);
//把混合效果绘制在新的透明背景图层上
Paint paint = new Paint();
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),R.mipmap.pink);
canvas.drawBitmap(bitmap1,0,0,paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.blue);
canvas.drawBitmap(bitmap,0,0,paint);
paint.setXfermode(null);
//把绘制完成的图层绘制在原来的图层上
canvas.restoreToCount(layerId);
}
这样便可得出正确的效果。