2011-03-25 70 views
10

我的应用程序使用标准的android翻译动画滑动视图进出屏幕。不幸的是,布局似乎很重:ImageView,一堆文本视图和一个包含文本和图像的图库。有两个视图正在生成动画 - 一个滑出,另一个滑入。沉重的布局平滑的动画

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

我想移除TranslateAnimations并尝试捕获位图中的视图内容并将它们作为ImageViews移动。

你有什么想法应该如何正确地完成这些任务,如果图像移动方法将有所帮助?

P.S.

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

回答

0

最后,我设法实现了使用自定义画廊视图所需的行为。它现在正在完善。

+0

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

6

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

+0

我已经试过了 '\t \t厂景=(WeatherInfoView)findViewById(R.id。小区1); \t \t view2 =(WeatherInfoView)findViewById(R.id.cell2); \t \t view3 =(WeatherInfoView)findViewById(R.id.cell3); \t \t \t \t view1.setDrawingCacheEnabled(true); \t \t view2.setDrawingCacheEnabled(true); \t \t view3.setDrawingCacheEnabled(true); ' 不幸的是,我看不到任何与绘图缓存启用的区别 – basv 2011-03-25 09:53:18

0

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

viewFlipper for animation

+0

这不完全是我想要的。据我了解,ViewFlipper不允许“交互式”视图滑动。在我的应用程序中,视图在用户滑动视图时跟随手指。 – basv 2011-03-25 10:11:14

+0

我也不明白为什么ViewFlipper应该比TranslateAnimations + – 2012-03-10 13:11:30

1

另一种解决办法是使你的意见到3D曲面和动画通过OpenGL的。这就是索尼如何做所有他们漂亮的动画,如在他们的TimeScape应用程序中。

有关于它的a blog post

+0

更快PS:我想这在GPU上执行时才是非常快的,Xperia设备就是这种情况。不确定较旧的Android手机是否可以用软件来做到这一点,在这种情况下,它可能会更慢。不过,可能值得调查,它看起来非常直截了当。 – Matthias 2011-03-25 10:20:24

+2

链接不再有效。 :( – 2013-05-09 09:24:47

0

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

2解决方案:

  1. 实现自己StaticTranslateAnimation和避免初始化它的每个移动事件(例如setTranslation(INT X,int y)对)。下行:这种方法只适用于单一动画。虽然在事件处理过程中没有实例化对象(在我的代码中),但是一次动画化两个对象导致垃圾回收。

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