ValueAnimators并以编程方式添加了Views?

时间:2014-12-11 19:42:23

标签: android animation

何时是以编程方式添加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,视图会立即显示,尽管不是动画。

之前是否有人遇到此问题?提前致谢!

0 个答案:

没有答案