0

我有一个应用程序,它在 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 上发布的应用程序中复制。

4

1 回答 1

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();
        }
    }
于 2014-02-28T10:50:22.937 回答