0

こんにちは皆さん、お役に立てば幸いです。ご覧いただきありがとうございます -

私はこれであるコイン回転アニメーションを実行するスレッドを持っています

    public class MainActivity extends Activity {
static AnimationDrawable frameAnimation;

public boolean currentSpin = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //is this where you want me to do it
    ImageView coinAnima = (ImageView) findViewById(R.id.imageView1);


    Button bt = (Button) findViewById(R.id.button1);
      bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        spinCoin1();
        }
    });

}
//end of onCreate

public void spinCoin1(){
    coinAnima = (ImageView) findViewById(R.id.imageView1);
    coinAnima.setBackgroundResource(R.anim.coin_spin_heads); 

        new Thread(new Runnable() {
                    public void run() {
                        frameAnimation = (AnimationDrawable) coinAnima.getBackground();
                        frameAnimation.start();

                        try {
                            Thread.sleep(5000);
                          } catch (InterruptedException e) {
                            e.printStackTrace();
                          }    

                          frameAnimation.stop();

                    //end of run
                    }

        //starts the thread        
         }).start();

//end of method      
}
//end of class
}

ボタンのオンクリックから実行され、ボタンを2回クリックするとエラーが発生します

これは

    03-10 23:33:28.804: E/AndroidRuntime(13689): FATAL EXCEPTION: Thread-12
03-10 23:33:28.804: E/AndroidRuntime(13689): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.view.ViewRoot.checkThread(ViewRoot.java:2936)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.view.ViewRoot.invalidateChild(ViewRoot.java:642)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:668)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.view.View.invalidate(View.java:5272)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.view.View.invalidateDrawable(View.java:7310)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.widget.ImageView.invalidateDrawable(ImageView.java:176)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:300)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:227)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.graphics.drawable.AnimationDrawable.setFrame(AnimationDrawable.java:211)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.graphics.drawable.AnimationDrawable.nextFrame(AnimationDrawable.java:203)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.graphics.drawable.AnimationDrawable.run(AnimationDrawable.java:140)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at android.graphics.drawable.AnimationDrawable.start(AnimationDrawable.java:107)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at com.example.testanima.MainActivity$2.run(MainActivity.java:61)
03-10 23:33:28.804: E/AndroidRuntime(13689):    at java.lang.Thread.run(Thread.java:1019)

誰でもこのエラーの修正を教えてもらえますか? 見てくれてありがとう

4

3 に答える 3

1

別のスレッドで GUI 要素を操作することはできません。これはドキュメントに明確に記載されています。

以下を使用して、run() の gui 要素を更新できます。

 public void run()
 ...
  runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            update gui elements
                        }
                 });
 ....

また、最初のアニメーションが完了したら、アニメーションで clear() を呼び出します。その後、複数回使用できます。

于 2014-03-10T13:03:24.207 に答える
0

これを試して、

public class MainActivity extends Activity {
static AnimationDrawable frameAnimation;

public boolean currentSpin = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //is this where you want me to do it
    ImageView coinAnima = (ImageView) findViewById(R.id.imageView1);
    coinAnima.setBackgroundResource(R.anim.coin_spin_heads);
    frameAnimation = (AnimationDrawable) coinAnima.getBackground();

Button bt = (Button) findViewById(R.id.button1);
  bt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    spinCoin1();
    }
});

}
//end of onCreate

public void spinCoin1(){  

    new Thread(new Runnable() {
                public void run() {

                    frameAnimation.start();

                    try {
                        Thread.sleep(5000);
                      } catch (InterruptedException e) {
                        e.printStackTrace();
                      }    

                      frameAnimation.stop();

                //end of run
                }

    //starts the thread        
     }).start();

  //end of method      
  }
//end of class
}

そしてこちらもチェック。

于 2014-03-10T13:14:04.920 に答える
0

ビューの残りの部分を作成するときに作成し、変数に設定することで、UI スレッドで coinAnima を作成できます。または、UI スレッドを使用する Handler を使用して、それを取得して実行可能ファイルを実行することもできます。UI スレッドでハンドラーを設定する方法については、このリンクを参照してくださいhttp://developer.android.com/training/multiple-threads/communicate-ui.html

于 2014-03-10T12:59:32.533 に答える