1

ユーザーが自分のスコアを星の形で表示するゲームのアクティビティでアニメーションを使用しました (最大スコアは 3 つ星になります)。各スターでアニメーションを使用しました(startAnimation()メソッドを使用)。金色の星は、平行移動、スケール、アルファ アニメーション (セット アニメーションを使用) を使用して、空白の灰色の星の上に配置されます。しかし、そのスコア アクティビティが開始されるたびに、アニメーションがぎくしゃくしたり、ラグがあったり、滑らかでなかったりして表示されます。そのアニメーションをスムーズでタイムリーにするための解決策は何ですか?

以下は、3 つ星のうち 3 つを表示する Java コードです。

protected void onCreate(Bundle savedInstanceState) 
    {
         ............
        Myanim1 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha_scale_left);
        Myanim2= AnimationUtils.loadAnimation(getApplicationContext(), R.anim.aplha_scale_mid);
        Myanim3= AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha_scale_right);
          ......}

if(pattern_Score>targetScore*90/100)
            {
                mCountDownTimer = new CountDownTimer(1000,100) {

                @Override
                public void onTick(long millisUntilFinished) {
                    starIv1.setImageResource(R.drawable.star_gray);
                }

                @Override
                public void onFinish() {
                    starIv1.startAnimation(Myanim1);
                    starIv1.setImageResource(R.drawable.star);
                    Toast.makeText(getApplicationContext(), "timer1 stopped", Toast.LENGTH_SHORT).show();
                }
            };
            mCountDownTimer.start();
            starIv1.clearAnimation();


                mCountDownTimer1=new CountDownTimer(2000,100) {

                    @Override
                    public void onTick(long millisUntilFinished) { 
                        starIv2.setImageResource(R.drawable.star_gray);
                    }

                    @Override
                    public void onFinish() {
                        //starIv2.clearAnimation(); 
                        starIv2.startAnimation(Myanim2);
                        starIv2.setImageResource(R.drawable.star);
                    }
                };
                mCountDownTimer1.start();
                starIv2.clearAnimation();

                mCountDownTimer2=new CountDownTimer(3000,100) {

                    @Override
                    public void onTick(long millisUntilFinished) { 
                        starIv3.setImageResource(R.drawable.star_gray);
                    }

                    @Override
                    public void onFinish() {
                        //starIv3.clearAnimation(); 
                        starIv3.startAnimation(Myanim3);
                        starIv3.setImageResource(R.drawable.star);
                    }
                };
                mCountDownTimer2.start();
                starIv3.clearAnimation();....}

alpha_scale_left.xml(左星のアニメーション)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<translate android:fromYDelta="-100%"
           android:fromXDelta="-20%" 
           android:toYDelta="0"
           android:toXDelta="0" 
           android:duration="600"/>
<scale 
        android:fromXScale="3000%"
        android:fromYScale="3000%"
        android:toXScale="1"
        android:toYScale="1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="900"
    />
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="600" />


</set>

alpha_scale_mid.xml(真ん中の星のアニメーション)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<translate android:fromYDelta="-100%"
           android:fromXDelta="-5%" 
           android:toYDelta="0"
           android:toXDelta="0" 
           android:duration="600"/>
<scale 
        android:fromXScale="3000%"
        android:fromYScale="3000%"
        android:toXScale="1"
        android:toYScale="1"
        android:pivotX="50%"
        android:pivotY="0%"
        android:duration="600"
    />
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="600" />

</set>

alpha_scale_right.xml(右星のアニメーション)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="-100%"
           android:fromXDelta="5%" 
           android:toYDelta="0"
           android:toXDelta="0" 
           android:duration="600"/>
<scale 
        android:fromXScale="3000%"
        android:fromYScale="3000%"
        android:toXScale="1"
        android:toYScale="1"
        android:pivotX="50%"
        android:pivotY="0%"
        android:duration="600"
    />
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="600" />

</set>
4

1 に答える 1

1
  • 3000%あなたのxmlsでの意味がわかりませんの範囲で変更してみてください~100%

コードを見ると、メイン スレッドにすべてのアニメーションをロードするのではなく、いくつかのスレッドを使用することをお勧めします。むしろ、メソッドをAsynctask使用し、進行状況に基づいて、onprogressupdateメソッドを使用して UI スレッドを変更することをお勧めします。

また

グラフィックスとアニメーションは、デバイスのプロセッサGPUまたはより一般的な用語で処理されます。適切にレンダリングされない場合は、プロセッサのクロック レートが低いことが原因である可能性があります。

于 2013-09-30T13:23:46.053 に答える