1

我有一个简单的活动,它使用 ObjectAnimator 显示动画。动画在activity的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的华为avenue y300上测试该应用程序并且跳跃不可见,运动非常流畅。

ObjectAnimator 和 Android 4.4 有什么问题?

谢谢

4

1 回答 1

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 方法中启动它。

于 2014-07-13T10:39:50.303 回答