当应用程序以后台或主页关闭时使用cpu的Android应用程序 - ViewPager中的动画

时间:2014-02-27 11:35:32

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

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

当我在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上发布的应用程序中无法复制。

1 个答案:

答案 0 :(得分:0)

确保动画结束是我找到的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();
        }
    }