我正在开发一个有很多画布而不是多个视图的库(可在这里找到).
当我努力改进它并使其适合我们对应用程序的需求(需要一些自定义)时,我注意到有一些行被标记为已弃用:
canvas.clipRect(0f, mHeaderHeight + mHeaderRowPadding * 2, mHeaderColumnWidth, height.toFloat(), Region.Op.REPLACE)
Run Code Online (Sandbox Code Playgroud)
事实上,我不认为有一个很好的候选人用新的API替换这行代码
看看文档,这是写的:
此方法在API级别26中已弃用.Interface.Op除INTERSECT和DIFFERENCE之外的值可以展开剪辑.画布剪辑API仅用于作为还原操作的结果展开剪辑.这使视图父级能够剪切画布以清楚地定义其子画面的最大绘制区域.推荐的替代调用是clipRect(RectF)和clipOutRect(RectF);
所以我尝试使用这些功能中的任何一个,但是它们都引起了以前的绘制问题.
看看弃用,似乎标记了函数本身,而不是Region.Op.REPLACE:
所以也许它真的没有替代品......
Rob*_*yer 33
1:Region.Op现在不推荐使用自定义的所有方法,因此现在只能使用两种方法变体:clipRect/ clipPath(代表Region.Op.INTERSECT)和clipOutRect/ clipOutPath(代表Region.Op.DIFFERENCE).要实现类似于Region.Op.REPLACE一个必须使用save()和restore()方法的功能:
canvas.clipRect(0, 0, 100, 100); // do some clipping
canvas.drawLine(...); // do some clipped drawing
canvas.clipRect(200, 200, 400, 400, Region.Op.REPLACE); // replace clipping region to completely different one
canvas.drawLine(...); // and some other drawing
Run Code Online (Sandbox Code Playgroud)
注意Canvas内部使用堆栈,因此您甚至可以save()在不同时刻多次调用.你不能打电话canvas.restore()多次canvas.save().
同样重要的是要求调用canvas.restore()更改剪辑rect(与canvas.save()调用时的值相同).因此,您必须restore()在需要应用剪切的所有绘图方法之后仔细调用调用.
2:可能是因为一些性能优化.我想我读到了某个地方(我现在找不到),对于GPU上的硬件加速,他们只能使用INTERSECT/DIFFERENCE剪辑操作,其他必须回退到CPU处理.这可能就是原因.
编辑:这是一些相关的答案,由于ICS启用了硬件加速,因此不支持某些ClipRect操作.
3:正如他们在文档中所说,它将停止在Android P中工作(可能仅在定位Android P时):
从API Level API级别Build.VERSION_CODES.P开始,只有INTERSECT和DIFFERENCE是有效的Region.Op参数.
| 归档时间: |
|
| 查看次数: |
5682 次 |
| 最近记录: |