setClipChildren和硬件层

时间:2013-12-02 19:52:25

标签: android android-animation

我有一个自定义视图组,我根据触摸事件(例如拖放)在屏幕上制作动画。

我希望它能够在其边界之外略微绘制,并且仍然可以平滑地制作动画。

我尝试在拖动视图上设置setLayerType(LAYER_TYPE_HARDWARE,null),性能很好,但是边界之外的任何内容都被剪切了。

我尝试设置LAYER_TYPE_NONE,性能仍然很好,但是视图被拖动时存在动画重影/条纹(好像它正在模糊屏幕)。

在Moto X和Nexus 4上尝试了相同的结果。

最好的方法是什么? setClipChildren(false)应该与LAYER_TYPE_HARDWARE一起使用吗?有趣的是,LAYER_TYPE_SOFTWARE表现出与LAYER_TYPE_HARDWARE相同的意外剪辑。

2 个答案:

答案 0 :(得分:5)

尝试使用以下组合:

setClipChildren(false);
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
android:hardwareAccelerated="false"

如下所述:ViewPager and setClipChildren(false) workaround for 2.x devices

答案 1 :(得分:2)

在做同样的事情时我遇到了类似的问题。我希望在我的观点下面留下阴影。问题是系统只会清理您移动的视图留下的矩形,并且由于您选择不剪切子项而在该视图外部渲染,因此矩形不会覆盖所有轨迹并且渲染视图的剩余部分将离开背后是一团糟。

我使用的解决方案是将我想要移动的视图放在另一个视图中(一个相对于父级中心的子视图对齐的RelativeLayout)稍微大一点,并覆盖投影或其他任何你在外面渲染的视图你孩子的界限。您可以将该父视图的背景设置为透明/清除。现在将拖动动作附加到父视图,并在其后面清理的Rect也将清理孩子的混乱。

我发现做到这一点的唯一另一种方法是性能非常昂贵,就是重新渲染显示每帧混乱的视图。我找不到任何其他解决方案。