【问题标题】:Android app using cpu when app closed with back or home - animations in ViewPager当应用程序以返回或主页关闭时使用 cpu 的 Android 应用程序 - ViewPager 中的动画
【发布时间】:2014-02-27 11:35:31
【问题描述】:

我有一个应用,它在 ViewPager 中的片段中包含动画。我有 ViewPager 显示在列表片段的空选项上。动画是在 AnimatorSets 中组合的 NineOldAndroids ObjectAnimators,其中一些动画 SVG 使用 svg-android 显示。

当我在 ViewPager 上更改页面时,动画停止在片段中使用此代码:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) { 
        if (myAnimationView != null) {
            myAnimationView.restartAnimation();
        }
    } else { 
        if (myAnimationView != null) {
            myAnimationView.stopAnimation();
        } 
    }
}

并且View中的这段代码实现了ValueAnimator.AnimatorUpdateListener:

    public void stopAnimation() {
        endAnimCalled = true;
        myAnimatorSet.end(); 
    }

    public void restartAnimation() {
        endAnimCalled = false;
        if (!myAnimatorSet.isStarted()) {
            myAnimatorSet.start();
        }
    } 

如果不在动画页面上时按返回退出,应用程序即使在几个小时后也会使用 1-5% 的 CPU。如果在制作动画时在页面上按下返回,则应用在后台运行时会占用 10-30% 的 CPU。

有没有好的方法可以通过 onPause 被调用的片段?任何想法为什么当动画停止时应用程序仍然使用 1-5% 的 CPU?

我发现这不可能在一个小到足以在 Stack Exchange 上发布的应用程序中复制。

【问题讨论】:

    标签: android android-fragments android-viewpager android-animation androidsvg


    【解决方案1】:

    确保动画结束是我为 CPU 使用率找到的唯一解决方案。我已将其设置为仅重复动画 10 次。我还考虑使用 BroadcastReceiver 从活动的 onPause() 传递广播,以在片段中调用 endAnimation()。

        public void startAnimation() {
            createAnimation();
            animRepeats = 0;
            if (!myAnimatorSet.isStarted()) {
                myAnimatorSet.start();
            }
            AnimatorListener myAnimListen = new AnimatorListener() {
                @Override
                public void onAnimationEnd(Animator animator) {
                    if (!endAnimCalled && animRepeats < 10) {
                        myAnimatorSet.start();  
                        animRepeats++;
                    }
                }
                @Override public void onAnimationRepeat(Animator animator) {}
                @Override public void onAnimationStart(Animator animator) {}
                @Override public void onAnimationCancel(Animator animation) {}
            };
    
            myAnimatorSet.addListener(myAnimListen);
        }
    
        public void stopAnimation() {
            endAnimCalled = true;
            myAnimatorSet.end(); 
        }
    
        public void restartAnimation() {
            endAnimCalled = false;
            if (!myAnimatorSet.isStarted()) {
                animRepeats = 0;
                myAnimatorSet.start();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      相关资源
      最近更新 更多