2011-08-17 23 views
0

我试图改变按钮上的图像,并将它们变回原始图像,并在4个不同的图像中一个接一个地完成它。如何在ImageButtons上一个接一个地更改图像?

我曾尝试下面的代码,但它没有工作,结果造成只有一个图像闪烁的milisecond:

ArrayList<Integer> scenario = new ArrayList<Integer>(); 

... 

void delayedPlay(){ 
    // each button should be posted in 1 second spacing 
    int count = 1; 
    for (final int btnid : scenario){ 
     // turn off 
     final Runnable r2 = new Runnable(){ 
      public void run(){ 
       imagebuttons[btnid].setImageBitmap(imagesTurnedOff.get(btnid)); 
       } 
     }; 

     // turn on and call turn off 
     Runnable r1 = new Runnable(){ 
      public void run(){ 
       imagebuttons[btnid].setImageBitmap(imagesTurnedOn.get(btnid)); 
       imagebuttons[btnid].postDelayed(r2, 1000); 
       } 
     }; 

     // post the above delayed 
     imagebuttons[btnid].postDelayed(r1, 1000 * count++); 
    } 
} 

谁能帮助我,并说明为什么它不不为我工作?

回答

1

它为我工作。你确定imagesTurnedOn/imagesTurnedOff正在返回正确的值吗?

这个解决方案在时间上有很多不足之处 - 它会非常不平衡。或许,这样的事情会更好地工作(使用的AsyncTask)

public void deplayedPlay2() { 
    if (mTaskHandler == null) { 
     mTaskHandler = new AsyncTask<Void, Void, Void>() { 
      @Override 
      public Void doInBackground(Void... params) { 
       long now = System.currentTimeMillis(); 
       try { 
        for (final int btnid : mScenario) { 
         Log.d(TAG, 
           "ON: " + btnid + " (" + (System.currentTimeMillis() - now) + ")"); 
         mButtons[btnid].post(new Runnable() { 
          public void run() { 
           mButtons[btnid] 
             .setBackgroundDrawable(GoodbyeAndroidActivity.this 
               .getResources() 
               .getDrawable(
                 R.drawable.on_icon)); 

          } 
         }); 
         Thread.sleep(1000); 
         Log.d(TAG, 
           "OFF: " + btnid + " (" + (System.currentTimeMillis() - now) + ")"); 
         mButtons[btnid].post(new Runnable() { 
          public void run() { 
           mButtons[btnid] 
             .setBackgroundDrawable(GoodbyeAndroidActivity.this 
               .getResources() 
               .getDrawable(
                 R.drawable.off_icon)); 
          } 
         }); 
        } 
       } catch (InterruptedException ex) { 
        Log.d(TAG, "Interrupted."); 
       } 
       return null; 
      } 

      @Override 
      public void onPostExecute(Void param) { 
       Log.d(TAG, "Done!"); 
       mTaskHandler = null; 
      } 
     }; 
     mTaskHandler.execute(); 
    } 
} 

不要忘记的onPause()来处理这个问题:

public void onPause() { 
    super.onPause(); 
    if (mTaskHandler != null) { 
     mTaskHandler.cancel(true); 
     // May want to reset buttons too? 
    } 
} 
+0

美丽!奇迹般有效!谢谢!顺便说一句 - 为什么你写:long now = System.currentTimeMillis(); ? – Ofershap

+0

我想查看相对于AsyncTask何时开始的时间点 - 仅用于Log.d消息。我在测试原始实现时将该代码放入。它的工作,但正如我所说,时间非常不平衡。很高兴它适合你。 – Jason

相关问题