自定义View之Xfermode总结

Xfermode样式

Paint的Xfermode Google官方ApiDemos中16种样式效果如下图

然后我写的demo中18样式如下

可以看到除了ADD,OVERLAY这两种ApiDemos没有绘制的模式外,其中CLEAR这种模式跟官方的不一样,这是什么原因呢?

其实是因为ApiDemos中的targetSdkVersion为23而我的为30,只要修改一下两者表现就一样了

 

DST与SRC怎么区分?

DST:先绘制的图形

SRC:后绘制的图形

Xfermode怎么理解?

Xfermode是Paint绘制的一种绘制模式,可以看作是SRC图形与DST图形根据Xfermode来做不同的叠加运算

Xfermode效果达不到预期?

图形根据Xfermode做不同叠加运算,但它们的运算还需要满足一些条件

1.绘制的图形须在同一层(saveLayer会使图层变化)

2.图形相交部分才做运算(Bitmap看作是一种图形所有Bitmap整个区域都会参与计算包括透明像素)

3.图形相交之外的部分根据Xfermode不同表现不同

请注意第二条这个很容易被忽略掉

不管是官方还是我的demo中,DST、SRC相交的部分都不仅仅是图形相交的部分

如果不好理解咱们来看下面这张图

这张图与上面demo中的SRC,DST所占大小实际上是不同的

在上面的demo中SRC,DST大小分别为

​    

而后面SRC,DST大小分别为

​   

所以他们参与的计算部分实际上是不同的

因此后面的SRC,DST相交部分的计算与demo中的SRC,DST表现一样,而不相交的部分因为没有参与计算所以表现是不同的

4.背景色也可以参与叠加运算

Canvas是有图层概念的我们的背景色以及onDraw方法中绘制的图形都在一个图层,所以在默认的图层中(即不调用saveLayer方法)绘制的图形使用Xfermode会与背景色一起叠加运算,这个时候叠加区域会变成黑色,这个时候我们需要设置一下图层支持硬件加速setLayerType(LAYER_TYPE_HARDWARE, paint)

posted @ 2021-06-17 16:40  果冻二筒  阅读(110)  评论(0)    收藏  举报