平滑动画以实现繁重的布局

时间:2011-03-25 09:26:31

标签: android animation

我的应用程序使用标准的android TranslateAnimation将视图滑入和滑出屏幕。不幸的是,布局似乎很重:ImageView,一堆文本视图和一个包含文本和图像的Gallery。有两个动画视图 - 一个滑出,另一个滑入。

问题在于这些动画的低性能,尤其是在CPU功能较弱的设备上。动画看起来不够流畅。

我正在考虑删除TranslateAnimations并尝试捕获Bitmap中的视图内容并将其作为ImageViews移动。

您是否有任何想法如何正确完成此类任务以及图像移动方法是否有帮助?

P.S。

我认为我可能以错误的方式使用动画。我在FrameLayout上有两个视图。一个是可见的,另一个不是。然后,当用户沿着屏幕移动手指时,我处理触摸事件并将TranslateAnimations应用于两个视图(在ACTION_MOVE上)。所以看起来用户将一个视图移出屏幕,同时从屏幕一侧拉出另一个视图。它适用于轻量级布局。

5 个答案:

答案 0 :(得分:6)

您应该在动画视图上启用绘图缓存。查看View.setDrawingCacheEnabled(boolean)的文档。

答案 1 :(得分:1)

另一种解决方案是将您的视图渲染到3D曲面上,并通过OpenGL动画化这些视图。这就是索尼所做的所有漂亮的动画,例如在他们的TimeScape应用程序中。

关于它有a blog post

答案 2 :(得分:0)

您必须尝试使用​​视图鳍状肢。将视图包含在其中并使用动画文件执行大量动画非常简单。 此链接可能会有所帮助:

viewFlipper for animation

答案 3 :(得分:0)

最后,我设法使用自定义的Gallery视图实现所需的行为。现在工作得很完美。

答案 4 :(得分:0)

当您对触摸事件做出反应时,您可能会在onTouch方法中实例化新的TranslateAnimations,这种方法经常被触发。大规模创建新实例会导致大量垃圾收集。

2个解决方案:

  1. 实现自己的StaticTranslateAnimation并避免在每个移动事件上实例化它(例如setTranslation(int x,int y))。缺点:这种方法仅适用于单个动画。一次动画两个对象再次导致垃圾收集,尽管在事件处理期间没有对象(在我的代码中)被实例化。

  2. 使用offsetLeftAndRight(int offset)和offsetTopAndBottom(int offset)代替动画,在旧版和Android 2.x设备上执行得更好,并完全避免垃圾回收。