1

簡単だと思うことを達成したいのですが、面倒であることがわかりました。

画像付きのロード画面があり、アプリケーションのロード中にフェードインおよびフェードアウトしたいと考えています。カウンターのサイン値に対して不透明度を頻繁に変更することで、これを達成することにしました。私のコードは次のとおりです。

ImageView   loadingRaven;   //loading raven at the start of the app
Timer       timer;          //timer that we're gonna have to use
int         elapsed = 0;    //elapsed time so far

/*
 * the following is in the onCreate() method after the ContentView has been set
 */

loadingRaven = (ImageView)findViewById(R.id.imageView1);


//fade the raven in and out
TimerTask task = new TimerTask()
{
    public void run()
    {
        elapsed++;

        //this line causes the app to fail
        loadingRaven.setAlpha((float)(Math.sin(elapsed)+1)/2);
    }
};
timer = new Timer();
timer.scheduleAtFixedRate(task, 0, 50);

プログラムが失敗する原因となっている問題は何ですか? Timer と TimerTask を正しく使用していますか? または、画像の不透明度を頻繁に更新してスムーズにイーズインおよびイーズアウトするためのより良い方法はありますか?

ありがとう

4

1 に答える 1

2

TimerTask は別のスレッドで実行されます。そのため、メインの ui スレッドで ui を更新します。runonuithread を使用する

      TimerTask task = new TimerTask()
      {
        public void run()
         {
          elapsed++;
              runOnUiThread(new Runnable() //run on ui thread
                 {
                  public void run() 
                  { 


                     loadingRaven.setAlpha((float)(Math.sin(elapsed)+1)/2)
                 }
                 });

     }
  };

TimerTask は別のスレッドで実行されます。pskink で提案されているように、Handler と postDelayed を使用できます。

于 2013-05-09T15:45:05.747 に答える