2017-07-31 61 views
2

我有一個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) 

你有什麼建議,如何解決這個問題?

+0

您是否解決了此問題? @makovkastar –

+0

不幸的是,當我需要運行測試時,我不得不放置一個標誌來禁用動畫。 – makovkastar

回答

1

檢查動畫製作者是否已經開始了怎麼辦?

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

謝謝你的答案,但它沒有幫助。無論如何,我在開始之前創建一個AnimatorSet的新實例。我無法想象當animatorSet.isStarted()在創建新實例之後立即返回true的情況。 – makovkastar

1

您可以在@Before方法中啓用該特定測試的動畫。測試完成後,您可以在@After方法中再次禁用動畫。這樣你的後續測試不會受到影響。 您也可以創建一個測試規則,以啓用/禁用特定類的動畫,如圖所示here

+0

謝謝你的答案,但它與Espresso無關。我只是想在測試設備上使用應用程序,但它在啓動畫面上崩潰。 – makovkastar