重型布局的流畅动画

10

我的应用程序使用标准的 Android TranslateAnimation 来滑动视图进出屏幕。不幸的是,布局似乎相当重:ImageView,一堆文本视图和一个包含文本和图像的 Gallery。有两个视图正在进行动画 - 一个滑出去,另一个滑进来。

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

我考虑删除 TranslateAnimations 并尝试捕获视图内容为位图并将其移动为 ImageView。

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

P.S.

我认为我可能使用了错误的动画方式。在 FrameLayout 中有两个视图,一个是可见的,另一个是不可见的。然后我处理触摸事件,并在用户沿着屏幕滑动手指时将 TranslateAnimations 应用于两个视图(在 ACTION_MOVE 上)。因此,它看起来像用户将一个视图从屏幕上拖出,同时从屏幕侧面拉出另一个视图。对于轻量级布局,它运行良好。

5个回答

6

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


我已经尝试过了view1 = (WeatherInfoView) findViewById(R.id.cell1); view2 = (WeatherInfoView) findViewById(R.id.cell2); view3 = (WeatherInfoView) findViewById(R.id.cell3); view1.setDrawingCacheEnabled(true); view2.setDrawingCacheEnabled(true); view3.setDrawingCacheEnabled(true);不幸的是,启用绘图缓存后我看不到任何区别。 - basv

1

另一个解决方案是将您的视图渲染到3D表面上,并通过OpenGL对其进行动画处理。这就是Sony在其TimeScape应用程序中展示的所有漂亮动画的方式。

这里有一篇博客文章介绍它。


PS:我认为只有在GPU上执行时才会非常快,这在Xperia设备上是这样的。不确定旧的Android手机是否会在软件中执行,如果是这种情况,那么它可能会更慢。尽管如此,仍然值得调查,因为看起来非常简单明了。 - mxk

0

你可以尝试使用视图翻转器(view flipper)。它非常简单,只需将你的视图包含在其中,并使用动画文件执行多种动画效果。

这个链接可能会有所帮助:

viewFlipper for animation


这不完全是我想要的。据我了解,ViewFlipper不能实现“交互式”视图滑动。在我的应用程序中,随着用户滑动视图,视图会跟随手指移动。 - basv
我也不明白为什么ViewFlipper比TranslateAnimations+更快。 - Glenn Bech

0

最终我成功地使用自定义的画廊视图实现了所需的行为。现在它完美地工作了。


更好的解决方案是使用基于Android启动器应用程序源代码的视图切换器。 http://marcreichelt.blogspot.com/2010/09/android-use-realviewswitcher-to-switch.html - basv

0

当你对触摸事件做出反应时,你可能会在onTouch方法中实例化新的TranslateAnimations,这个方法经常被调用。大量创建新实例会导致大量垃圾回收。

有两种解决方案:

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

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


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