何时是以编程方式添加View的ValueAnimator的最佳时间?
例如:
View v = new View;
v.setVisibility(View.GONE);
viewGroup.addView(v);
v.setVisibility(View.VISIBLE);
ObjectAnimator.ofFloat(v, "translationY", v.getHeight() / 4, 0).start();
在这种情况下,View
立即可见,并在适当的位置绘制。但是,此动画不执行任何操作,因为v.getHeight()
最初将返回0.这两个解决方法是:
v.post(new Runnable() {
v.setVisibility(View.VISIBLE);
ObjectAnimator.ofFloat(v, "translationY", v.getHeight() / 4, 0).start();
});
和
v.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
v.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
v.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
v.setVisibility(View.VISIBLE);
ObjectAnimator.ofFloat(v, "translationY", v.getHeight() / 4, 0).start();
}
});
这两种解决方法都是通过等待系统计算和衡量布局v.getHeight()
来确保View
返回View
的实际高度,而不是0。 / p>
问题是,在调用run()
或onGlobalLayout()
之前多长时间时,我得到的数字最多为80毫秒,这意味着我在{{1}之前等待5帧变得可见!从用户的角度来看,这是不可接受的,特别是因为如果您没有附加监听器或发布Runnable,视图会立即显示,尽管不是动画。
之前是否有人遇到此问题?提前致谢!