一旦我的应用程序同时运行~4 +动画,动画开始滞后一点。有什么办法可以解决/优化吗?我正在使用ObjectAnimator和ValueAnimator。
答案 0 :(得分:5)
因此,如果视图不必在动画期间重绘,则可以在动画持续时间内启用硬件图层。例如:
final View myView = // your view
Animator animator = ObjectAnimator.ofFloat(myView, View.ALPHA, 0f, 1f);
animator.setDuration(1000);
animator.addAnimatorListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
myView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
@Override
public void onAnimationCancel(Animator animator) {
myView.setLayerType(View.LAYER_TYPE_NONE, null);
}
@Override
public void onAnimationEnd(Animator animator) {
// See http://stackoverflow.com/a/19615205/321697
myView.post(new Runnable() {
@Override
public void run() {
myView.setLayerType(View.LAYER_TYPE_NONE, null);
}
}
}
}
animator.start();
我建议将该侦听器实现分解为一个单独的类,但一般的想法是,您希望在动画启动后立即将视图放入硬件支持的层(动画属性,如平移,旋转,当由硬件层支持时,缩放和alpha非常便宜,然后在动画完成后清除图层。
在onAnimationEnd
回调中,如果您在onAnimationEnd回调中将图层类型设置为无,那么您会注意到另一个答案的链接,其中有4.0.x的错误。如果您只支持4.1及更高版本,则无需运行间接。
编辑:如果您要设置颜色过渡动画,则可能不想想要执行上述操作,因为更改视图的颜色需要重新绘制,导致它在每个帧上重建硬件层。
答案 1 :(得分:0)
如果您还没有使用ViewPropertyAnimator
,最好这样做。我顺利地移动并翻转(改变了图片)52 imageViews
(一副扑克牌)。
Here's有关如何使用ViewPropertyAnimator
的示例。