3

我想知道为什么我仍然无法找到一种方法来做到这一点。虽然看起来很简单,但我花了一整天的时间。但不能那样做。

我有一组骰子图像。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 都没有任何错误。

我发现线程也不能解决问题。

4

3 回答 3

8

首先,在 android 中已经有一个动画集,可以帮助你在它被称为FrameAnimation之后实现你的目标,这里是一个如何使用它的示例:

FrameAnimation 示例

您的第一、第二和第三个代码在主线程中运行,您永远不应该在主线程中使用睡眠!

如果您仍想手动设置图像资源,可以使用以下代码:

    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);
于 2013-02-06T16:23:20.097 回答
4

当您使用项目列表并根据时间间隔一一更改时,这很有帮助。初始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);
于 2015-11-11T16:51:35.210 回答
1

您可能看不到更改的原因是,主 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 循环中。

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

于 2013-02-06T16:18:15.327 回答