setClipChildren和硬件层

7
我有一个自定义视图组,基于触摸事件(拖放等)在屏幕上进行动画处理。我希望它能够略微超出其边界绘制,并且仍然可以平滑地进行动画处理。
我尝试在拖动视图上设置setLayerType(LAYER_TYPE_HARDWARE,null),性能非常好,但是超出边界的任何内容都被裁剪了。
我尝试设置LAYER_TYPE_NONE,性能仍然不错,但是视图拖动后存在动画残影/模糊效果(就像在屏幕上涂抹一样)。
我在Moto X和Nexus 4上尝试了这个方法,结果相同。
最好的方法是什么? setClipChildren(false)是否应该与LAYER_TYPE_HARDWARE一起使用?有趣的是,LAYER_TYPE_SOFTWARE和LAYER_TYPE_HARDWARE都显示出与预期不同的剪切效果。

在容器内拖动视图之前,尝试使被拖动的视图所占用的矩形无效,以避免幽灵影像。 - Pasquale Anatriello
你找到解决办法了吗? - Lrdwhyt
2个回答

5

肯定希望该活动得到硬件加速,因为对于大多数具有许多移动UI元素的应用程序来说,这不是一个很重要的问题吗? - secureboot

2

我在做同样的事情时遇到了类似的问题。我想要在我的视图下方添加一个阴影。但问题是,系统只会清理移动过的视图所留下的矩形区域,而由于你选择不剪裁子视图而在视图之外进行渲染,因此该矩形无法覆盖你所有的轨迹,渲染视图的残留部分将留下一种模糊的混乱。

我使用的解决方法是将我想要移动的视图放在另一个视图中(一个RelativeLayout,其子视图与父视图的中心对齐),后者稍微大一些并确实覆盖了你在子视图范围之外绘制的阴影或任何其他东西。你可以将该父视图的背景设置为透明/清晰。现在将拖动操作附加到父视图上,用来清理它后面的矩形,这样也将清理子视图的混乱痕迹。

我找到的唯一其他方法是性能相当消耗的,即在每个帧中重新渲染显示混乱的视图。我找不到其他的解决方案。


这对于解释为什么在没有硬件层的情况下这样工作很有用,但我认为在某些设备上使用硬件层非常关键。我这里说错了吗? - secureboot
在Android版本14及以上的设备上,硬件加速已经自动开启。我提供的解决方案可以在硬件加速开启或关闭的情况下工作,但说实话,我发现开启硬件加速会比关闭时出现更多问题。 - SDJMcHattie
我会试一下,但是在没有硬件层的情况下,我尝试过的大多数拖动/移动操作都会在类似S3的设备上明显掉帧。另外,这个答案难道不只是“不要使用setClipChildren”的变体吗?如果我不剪切子视图,一开始就不会有任何问题,对吧? - secureboot
不,我的意思是允许您的子视图渲染超出其边界,但将其嵌套在一个更大的父视图中,该父视图是透明的并且足够大以容纳子视图外部的内容,然后移动父视图以获得所需的效果。我知道这很有效,因为我在即将发布的装饰应用程序中使用了这个技巧,您可以在其中移动照片、颜色芯片和文本,并使它们带有超出其边界的阴影。 - SDJMcHattie
这个已经可以工作了。我使用了FrameLayout,并给它一个固定的宽度和高度,而不是wrap_content,然后就完成了。 - Oliver Hausler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接