2013-02-06 57 views
3

我想知道为什么仍然无法找到一种方法来做到这一点。虽然看起来很简单,但我花了整整一天的时间。但不能这样做。在循环中更改图像 - Android

我有一套骰子图像。 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保持不变,并在上次迭代循环中突然改变。 在这三种情况下,logcat中没有任何错误。

有人可以帮助我吗?线程也没有办法。任何测试解决方案将不胜感激。

谢谢大家。

回答

5

首先已经有一个动画android的设置,可以帮助你achive你是什么所谓FrameAnimation后,这里是如何使用它的一个例子:

FrameAnimation Example

你的第一,第二和第三代码正在主线程中运行,你不应该在主线程中使用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); 
+0

非常感谢Mr.Me.可运行的代码工作得很好。我之前也用过这个,但问题是我没有调用'handler.postDelayed(this,500);'方法。非常感谢。 –

1

您可能没有看到更改的原因是因为主线程线程的最终回调发生在线程完成其执行之后,并且只能看到最终结果。现在,这是我的(可能是穷人)的理解,有人更精通它可能可以纠正我。

也就是说你应该看看使用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确保它循环,而不是完成动画并停在最后一个图像上。

+0

这个解决方案第一个动画循环的第一帧在200ms后出现。有没有什么办法解决这一问题? – Lester

3

这是有用的,当你使用的产品清单,并通过一个不断变化的,根据时间间隔之一。最初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);