ObjectAnimator从Android 4.4(nexus 5)上的帧跳转开始,但不在4.1设备中

时间:2014-07-13 09:41:55

标签: android android-layout android-animation android-4.4-kitkat objectanimator

我有一个简单的活动,用ObjectAnimator显示动画。动画是在活动的onCreate方法中创建和启动的,它是一个非常简单的动画:

cloudAnim = ObjectAnimator.ofFloat(cloud1ImageView, "x", sw);
        cloudAnim.setDuration(35000);
        cloudAnim.setRepeatCount(ValueAnimator.INFINITE);
        cloudAnim.setRepeatMode(ValueAnimator.RESTART);
        cloudAnim.setInterpolator(null);
        cloudAnim.start();

它只是在屏幕左侧显示一个云,并从左向右移动。

问题是在我的nexus 5(android 4.4 lastet版本)中,当活动开始时,云正在进行帧跳转。

这个跳转只能在我的nexus 5中看到,因为我正在使用android 4.1测试应用程序中的huawei上升y300,并且跳转不可见,运动非常流畅。

ObjectAnimator和Android 4.4有什么问题?

由于

1 个答案:

答案 0 :(得分:0)

在onCreate中开始动画不是一个好主意。当用户最终能够看到这个动画时(在活动被充气并在屏幕上显示动画等)之后,动画不在它的开头而是在它之后,所以用户将错过最开始的动画或者也许会看到一些帧丢失。最终结果实际上取决于设备,Android版本,标准窗口动画样式等。

如果要在创建活动后立即启动动画,请使用 onWindowFocusChanged 方法: http://developer.android.com/reference/android/app/Activity.html#onWindowFocusChanged(boolean)

  

当活动的当前窗口获得或失去焦点时调用。   这是该活动是否可见的最佳指标   用户。


另外你需要做一些检查:

    1。窗口具有焦点( hasFocus == true) - 用户可以看到
    2。创建表示动画已经启动的布尔变量,因此它只会启动一次
private boolean cloudAnimStarted;

@Override
public void onWindowFocusChanged (boolean hasFocus) {
   super.onWindowFocusChanged(hasFocus);
   if (hasFocus && !cloudAnimStarted) {
       cloudAnimStarted = true;
       cloudAnim.start();
   }
}

因此在onCreate中创建 cloudAnim 对象很好,但启动它应该在onWindowFocusChanged方法中完成。