Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 禁用设备上的动画会使应用程序崩溃_Android_Android Animation_Android Espresso_Animator - Fatal编程技术网

Android 禁用设备上的动画会使应用程序崩溃

Android 禁用设备上的动画会使应用程序崩溃,android,android-animation,android-espresso,animator,Android,Android Animation,Android Espresso,Animator,我有一个AnimationDrawable,它播放一个帧动画,然后下一个活动从一个圆形显示动画开始: @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { AnimationDrawable animationDrawable =

我有一个AnimationDrawable,它播放一个帧动画,然后下一个活动从一个圆形显示动画开始:

  @Override
  public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
          AnimationDrawable animationDrawable =
                  (AnimationDrawable) mAnimationSceneImage.getDrawable();
          animationDrawable.start();

          mHandler.postDelayed(new Runnable() {
              @Override
              public void run() {
                  startMapActivityWithAnimation();
              }
          }, 1000);
      }
  }

  @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  private void startMapActivityWithAnimation() {
      int colorFrom = ContextCompat.getColor(this, R.color.window_background_splash);
      int colorTo = ContextCompat.getColor(this, android.R.color.white);

      ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
      colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
          @Override
          public void onAnimationUpdate(ValueAnimator valueAnimator) {
              mCircularRevealView.setBackgroundColor((Integer) valueAnimator.getAnimatedValue());
          }
      });

      int cx = mCircularRevealView.getWidth() / 2;
      int cy = mCircularRevealView.getHeight() / 2;
      float finalRadius = Math.max(cx, cy);

      Animator circularRevealAnimation = ViewAnimationUtils
              .createCircularReveal(mCircularRevealView, cx, cy, 0, finalRadius);
      mCircularRevealView.setVisibility(View.VISIBLE);

      AnimatorSet animatorSet = new AnimatorSet();
      animatorSet.setDuration(200);
      animatorSet.addListener(new AnimatorListenerAdapter() {
          @Override
          public void onAnimationStart(Animator animation) {
              mLogoImage.animate()
                      .alpha(0.0f)
                      .setDuration(200)
                      .setInterpolator(new AccelerateInterpolator())
                      .start();
            }

          @Override
          public void onAnimationEnd(Animator animation) {
              startMapActivity();
          }
      });
      animatorSet.playTogether(colorAnimation, circularRevealAnimation);
      animatorSet.start();
    }
动画可以在普通设备上完美运行。我还有一些浓缩咖啡UI测试,所以我已经在测试设备上禁用了开发者选项屏幕中的所有动画,现在我得到了以下异常:

java.lang.IllegalStateException: Animator has already started, cannot change it now!
             at android.view.RenderNodeAnimator.checkMutable(RenderNodeAnimator.java:149)
             at android.view.RenderNodeAnimator.setDuration(RenderNodeAnimator.java:324)
             at android.view.RenderNodeAnimator.setDuration(RenderNodeAnimator.java:322)
             at android.animation.AnimatorSet.updateAnimatorsDuration(AnimatorSet.java:760)
             at android.animation.AnimatorSet.getTotalDuration(AnimatorSet.java:1721)
             at android.animation.AnimatorSet.forceToEnd(AnimatorSet.java:446)
             at android.animation.AnimatorSet.doAnimationFrame(AnimatorSet.java:981)
             at android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:145)
             at android.animation.AnimationHandler.-wrap2(Unknown Source:0)
             at android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:54)
             at android.view.Choreographer$CallbackRecord.run(Choreographer.java:884)
             at android.view.Choreographer.doCallbacks(Choreographer.java:698)
             at android.view.Choreographer.doFrame(Choreographer.java:630)
             at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:872)
             at android.os.Handler.handleCallback(Handler.java:769)
             at android.os.Handler.dispatchMessage(Handler.java:98)
             at android.os.Looper.loop(Looper.java:164)
             at android.app.ActivityThread.main(ActivityThread.java:6540)
             at java.lang.reflect.Method.invoke(Native Method)
             at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

你对如何解决这个问题有什么建议吗?

检查动画师是否已经开始工作了

if (!animatorSet.isStarted()) {
    animatorSet.start();
}

您可以在@Before方法中为该特定测试启用动画。测试完成后,可以在@After方法中再次禁用动画。这样您的后续测试就不会受到影响。
您还可以创建一个测试规则来启用/禁用特定类的动画,如图所示。我遇到了相同的问题,并且已经解决了。不能在类AnimatorSet中使用方法setDuration,它可能会在设备8.0上导致此问题。您可以在每个动画师中使用方法setDuration

private void startMapActivityWithAnimation() {
  int colorFrom = ContextCompat.getColor(this, R.color.window_background_splash);
  int colorTo = ContextCompat.getColor(this, android.R.color.white);

  ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
  colorAnimation.setDuration(200);
  colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
      @Override
      public void onAnimationUpdate(ValueAnimator valueAnimator) {
          mCircularRevealView.setBackgroundColor((Integer) valueAnimator.getAnimatedValue());
      }
  });

  int cx = mCircularRevealView.getWidth() / 2;
  int cy = mCircularRevealView.getHeight() / 2;
  float finalRadius = Math.max(cx, cy);

  Animator circularRevealAnimation = ViewAnimationUtils
          .createCircularReveal(mCircularRevealView, cx, cy, 0, finalRadius);
  circularRevealAnimation.setDuration(200);
  mCircularRevealView.setVisibility(View.VISIBLE);

  AnimatorSet animatorSet = new AnimatorSet();
  animatorSet.addListener(new AnimatorListenerAdapter() {
      @Override
      public void onAnimationStart(Animator animation) {
          mLogoImage.animate()
                  .alpha(0.0f)
                  .setDuration(200)
                  .setInterpolator(new AccelerateInterpolator())
                  .start();
        }

      @Override
      public void onAnimationEnd(Animator animation) {
          startMapActivity();
      }
  });
  animatorSet.playTogether(colorAnimation, circularRevealAnimation);
  animatorSet.start();
}

谢谢你的回答,但没用。无论如何,我在启动AnimatorSet之前创建了一个新的AnimatorSet实例。我无法想象animatorSet.isStarted()在创建一个新实例后立即返回true的情况。谢谢你的回答,但这与浓缩咖啡无关。我只是想在测试设备上使用该应用程序,但它在启动屏幕上崩溃。你解决了这个问题吗@不幸的是,当我需要运行测试时,我必须设置一个标志来禁用动画。