【发布时间】:2019-03-11 07:30:30
【问题描述】:
我正在尝试为TextView 的宽度设置动画,在我的 Redmi Note 4 上它运行良好。然而,在速度稍慢的手机(1.2 GHz 四核)上进行测试时,动画的延迟非常糟糕。
经过一些入门调试,原来是调用requestLayout()是罪魁祸首,它丢了很多帧,经过进一步检查,原来是onMeasure(),这是重绘时调用的第一个方法 , 被称为很多只有 1 TextView 被动画。父层次结构的其余部分很可能将其称为“冒泡”到根。
在我的情况下,这绝对不是 bueno。我正在尝试为宽度和高度设置动画。我使用ValueAnimator 并在onAnimationUpdate() 内部调用requestLayout,我尝试仅在其中一个内部调用requestLayout(),但它几乎没有任何影响。
final ViewGroup.LayoutParams layoutParams = container.getLayoutParams();
ValueAnimator anim = ValueAnimator.ofInt(this.width, ((int) (this.screenWidth / 1.5)));
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
layoutParams.width = (int) (Integer) valueAnimator.getAnimatedValue();
}
});
anim.setDuration(duration);
anim.start();
anim = ValueAnimator.ofInt(this.height, this.screenHeight / 2);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
layoutParams.height = (int) (Integer) valueAnimator.getAnimatedValue();
container.requestLayout();
}
});
anim.setDuration(duration);
anim.start();
我尝试制作自定义 StaticLayout 以利用这种方法的一些效率和性能优化,但它也没有帮助。毕竟 View 类本身就是反复调用 onMeasure() 的东西,那么我该如何防止这种情况,只更新我愿意调整大小的 TextView 呢?当然invalidate() 不会起作用,因为它会错过调整大小的工作。
【问题讨论】:
标签: android performance android-layout optimization drawing