3

なぜまだこれを行う方法を見つけられなかったのか疑問に思います。とてもシンプルに思えますが、一日中これに費やしました。しかし、それはできませんでした。

サイコロの画像をセットしました。1.png、2.png、....および6.png。レイアウトにImageViewがあります。あれは、

ImageView dice = (ImageView) findViewById(R.id.imageViewrollingdiceOne);

ここでは、このimageViewをすばやく変更して、上記の6つの画像を使用したある種のビジュアル/アニメーションを表示したいと思います。そのために、私は次のコードを書きました。

コード1:

for (int j=0;j<10;j++){
        int randomNum = random.nextInt(6);
            System.out.println("Random Value " + randomNum);
            dice.setImageResource(images[randomNum]);               
    }

出力:

ビジュアルはありません。imageViewは変更されないままで、ループの最後の反復で突然変更されます。ループが非常に高速に実行されているためだと思いました。それから私は次のことをしました。

コード2:

for (int j=0;j<10;j++){
        int randomNum = random.nextInt(6);
            System.out.println("Random Value " + randomNum);
            dice.setImageResource(images[randomNum]);
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }               
    }

出力:

ここでもビジュアルはありません。imageViewは変更されないままで、ループの最後の反復で突然変更されます。それから私は次のことをしました。

コード3:

final Handler localHandler = new Handler();
    Runnable runnableObject = new Runnable() {
        public void run() {
            final ImageView dice = (ImageView) findViewById(R.id.imageViewrollingdiceOne);
            int randomNum = random.nextInt(6);
            System.out.println("Random Value" + randomNum);
            dice.setImageResource(images[randomNum]);
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    };
    for (int j=0;j<10;j++){
        localHandler.postDelayed(runnableObject, 1000);
    }

ここでもビジュアルはありません。imageViewは変更されないままで、ループの最後の反復で突然変更されます。3つのケースすべてでlogcatにエラーはありません。

糸脱毛もうまくいかないことがわかりました。

4

3 に答える 3

8

まず第一に、FrameAnimationと呼ばれた後にあなたが何であるかを達成するのを助けることができるAndroidのアニメーションセットがすでにあります、これはそれを使用する方法の例です:

FrameAnimationの例

1番目、2番目、3番目のコードはメインスレッドで実行されています。メインスレッドでsleepを使用しないでください。

それでも画像リソースを手動で設定する場合は、次のコードを使用できます。

    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {
            int randomNum = random.nextInt(6);
            dice.setImageResource(images[randomNum]);
            handler.postDelayed(this, 500);
        }
    }, 500);
于 2013-02-06T16:23:20.097 に答える
4

これは、アイテムのリストを使用していて、時間間隔に応じて1つずつ変更する場合に役立ちます。最初iの値は0である必要があり、リストのサイズは異なります。

final Handler handler = new Handler();
handler.postDelayed(new Runnable(){
    public void run(){
        if(i<4) {
            galleryImg.setImageResource(myImageList[i]);
            i++;
        } else {
            i=0;
        }
        handler.postDelayed(this, 10000);
    }
}, 500);
于 2015-11-11T16:51:35.210 に答える
1

おそらく変更が表示されない理由は、メインUIスレッドへの最後のコールバックは、スレッドの実行が終了した後に発生し、最終結果のみが表示されるためです。さて、これは私の(おそらく貧弱な)理解であり、それに精通している誰かがおそらく私を訂正することができます。

つまりAnimationDrawable、おそらくオブジェクトの使用を検討する必要があります。

ImageView sImage = (ImageView)findViewById(R.id.imageViewrollingdiceOne);
AnimationDrawable anim = new AnimationDrawable();

for (int j=0;j<6;j++) {
  anim.addFrame(new BitmapDrawable(images[j], 200);
}

sImage.setBackgroundDrawable(anim);
anim.setOneShot(false);
anim.start();

これはimages[]、すでにランダムな順序で画像を生成していることを前提としています。これを変更したい場合は、必要なコードをforループに入れてください。

gifそれが行うことは、変更間の設定された遅延間隔(このコードでは200ms)で作品を見るのとよく似たアニメーションオブジェクトを作成することです。必要に応じて、その番号を変更することを選択できます。setOneShot呼び出しは、アニメーションを終了して最後の画像で停止するのではなく、ループすることを確認します。

于 2013-02-06T16:18:15.327 に答える