所以我有一个非常简单的活动。它包含一个ListView,用1000个30dp高的空行填充屏幕,所以整个东西看起来是白色的。我有一个红色的空RelativeLayout,它是屏幕的宽度,44dp高在ListView的顶部呈现。我还有一个非常简单的值动画师,通过设置TranslationY属性,在一个周期内在屏幕上上下动画红色条。
我正在使用HTC One,而且我发现动画时我看到酒吧上下都会出现大量口吃。它似乎每隔一两秒就会丢几帧。我似乎没有做任何应该创造任何垃圾的东西..但这里是有趣的部分...当我触摸ListView并向上和向下滚动时,条形动画执行更顺畅。它仍然不完美,但根据我的估计它大约好5倍。我认为这是一些Android优化..也许在ListViews上滚动动画期间给予UI线程更高的优先级?也许它在滚动期间禁用某些后台任务以保持UI线程不被中断?我读过iOS做了一些这样的技巧。我的问题是有人知道Android上发生了什么吗?我已经做了一些谷歌搜索,找不到任何有用的东西。我正处于尝试优化这些动画的最初阶段,但如果有一个技巧我可以使用像特定动画事件期间的UI线程的优先级或任何其他会重现手动滚动ListView的效果似乎对我的动画表现来说,这对我来说是一个巨大的胜利。
除了“不要创建垃圾”和“不要阻止UI线程”之外,任何优化简单动画的一般提示都会很方便。
提前致谢
根据要求,我会发布我的getView
方法。在这一点上,我承认我正在使用一个有点奇特的设置。我正在使用带有F#的Xamarin工具链。方法如下:
override this.GetView(position, view, parent) =
match view with
| null -> context.LayoutInflater.Inflate(getLayout(this.get_Item(position)), null)
| _ -> view
|> convertView (this.get_Item(position))
向不熟悉语法的人澄清这里发生的事情。方法模式的前3行与view参数匹配,要么返回新的膨胀视图,要么只返回视图本身未触及的视图。 4rth行将该模式匹配表达式的结果作为convertView
函数的最后一个参数进行管道,该函数是在此ListAdapter
子类的构造函数中传递的函数。这里没有什么特别不寻常的事情。每次调用方法时都没有创建垃圾。但更重要的是,当ListView
无效时,我的动画会执行更糟。因此,动画口吃的来源不能主要与getView
方法中的任何内容有关。