0

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();
        } 
    }
}

ビュー内のこのコードは、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 に答える