在循环中更改图像 – 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都没有任何错误。

有人可以帮我这个吗? 线程也无法解决问题。 任何经过测试的解决方案都将受

谢谢大家。

首先,android中已经有一个动画集,它可以帮助你在它被称为FrameAnimation之后得到你想要的东西,下面是一个如何使用它的例子:

FrameAnimation示例

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

当您使用项目列表并逐个更改时间间隔时,这非常有用。 最初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); 

您可能没有看到更改的原因是因为主线程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-loop中放置你需要的代码。

它的作用是创建一个动画对象,就像你看到一个gif工作,在更改之间设置一个延迟间隔(在这段代码中它的200ms)。 如果您愿意,您可以选择更改该号码。 setOneShot调用确保它循环而不是完成动画并停在最后一个图像上。