首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ImageView中连续显示图像序列

在ImageView中连续显示图像序列
EN

Stack Overflow用户
提问于 2013-11-25 18:21:05
回答 3查看 6.2K关注 0票数 4

我有蜡烛和火焰作为单独的图像视图。当用户点击火焰时,其可绘制资源被设置为透明,这意味着火焰已经熄灭。

我也想在火焰被吹灭的时候展示烟雾。为此,我有大约21张黑烟的图片,可以快速地显示出来,这样用户就可以把它看作是烟雾。这是我的代码,当火焰被点击时挂起(R.drawable.smoke_22是火焰的透明图像,R.drawable.candle_1是黄色的火焰图像,标志是跟踪火焰当前是否被吹灭。flag=flase表示火焰仍在燃烧):

代码语言:javascript
复制
int[] smokeImages = { R.drawable.smoke_1, R.drawable.smoke_2,
        R.drawable.smoke_3, R.drawable.smoke_4, R.drawable.smoke_5,
        R.drawable.smoke_6, R.drawable.smoke_7, R.drawable.smoke_8,
        R.drawable.smoke_9, R.drawable.smoke_10, R.drawable.smoke_11,
        R.drawable.smoke_12, R.drawable.smoke_13, R.drawable.smoke_14,
        R.drawable.smoke_15, R.drawable.smoke_16, R.drawable.smoke_17,
        R.drawable.smoke_18, R.drawable.smoke_19, R.drawable.smoke_20,
        R.drawable.smoke_21 };


    this.flamImageView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (flag) {
                flamImageView.setImageDrawable(getResources().getDrawable(
                        R.drawable.smoke_22));
                flag = false;
                startTimer();
            } else {
                flamImageView.setImageDrawable(getResources().getDrawable(
                        R.drawable.candle_1));
                flag = true;
                smokemageView.setImageResource(R.drawable.smoke_22);
            }
        }
    });
}

private void startTimer() {
    for (int i = 0; i < 21; i++) {
        try {
            Thread.sleep(250);
            smokemageView.setImageResource(smokeImages[i]);
        } catch (InterruptedException localInterruptedException) {
        }
    }
    smokemageView.setImageResource(R.drawable.smoke_22);
}

火焰确实会熄灭,但我看不出正确的烟雾动画。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-25 18:50:50

--您可以简单地将for语句包装在一个want循环中,由一个布尔值触发:只需将布尔值设置为true,就可以让可绘制的语句动画化。

代码语言:javascript
复制
private void startTimer() {

while (timing) {
    for (int i = 0; i < 21; i++) {
        try {
            Thread.sleep(250);
            smokemageView.setImageResource(smokeImages[i]);
        } catch (InterruptedException localInterruptedException) {
      }
    }
  }
  smokemageView.setImageResource(R.drawable.smoke_22);
}

否则,您可以创建一个AnimationDrawable 对象:(可能更容易,更好地防止错误)。

代码语言:javascript
复制
AnimationDrawable anim = new AnimationDrawable();
        anim.addFrame(
                getResources().getDrawable(R.drawable.smoke_1),
                250);
        anim.addFrame(
                getResources().getDrawable(R.drawable.smoke_2),
                250);
        anim.addFrame(
                getResources().getDrawable(R.drawable.smoke_3),
                250);
        anim.addFrame(
                getResources().getDrawable(R.drawable.smoke_4),
                250);

        //......So on, so forth until you have a satisfying animation sequence


        //set ImageView to AnimatedDrawable
        smokemageView.setImageDrawable(anim);

        //if you want the animation to loop, set false
        anim.setOneShot(false);
        anim.start();

我当然希望这有帮助,快乐编码!

票数 11
EN

Stack Overflow用户

发布于 2013-11-25 19:02:19

Thread.sleep是坏的。真的很糟糕。

但是,我建议您使用计时处理程序

TimerTask的一个小小的例子:

代码语言:javascript
复制
Timer timer = new Timer();
timer.schedule(new ImageTask(), 0, 250);

class ImageTask extends TimerTask {
    public void run() {
        // Change image here.
    }
}

ImageTask类将每250 be执行一次。你可以在那里改变你的形象。

Handler的一个小小的例子:

代码语言:javascript
复制
final Handler handler = new Handler();
final Runnable r = new Runnable() {
    public void run() {
        // Change image here.
        handler.postDelayed(this, 250);
    }
};
handler.post(r);

它可以解决你的问题,但到目前为止,这不是最好的方法。GreyBeardedGeek为您的问题提供了一个很好的替代解决方案。

票数 2
EN

Stack Overflow用户

发布于 2013-11-25 19:03:01

虽然这里的其他一些答案可能会解决您当前的问题,但这并不是创建动画的最佳方法。

更好的方法是使用AnimationDrawable类,让框架为您完成所有工作:

http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20200341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档