【问题标题】:How to reset AnimationDrawable如何重置 AnimationDrawable
【发布时间】:2011-10-07 09:25:06
【问题描述】:

我必须为一个圆形倒计时计时器设置动画,我通过使用 AnimationDrawable 为 ImageView 的背景设置动画来实现(每个图像都删除了相应的圆圈切片)。问题是用户可以暂停这个动画,所以我必须重新加载动画,但随后出现问题。我尝试将动画设置为 null,将 ImageView 的背景设置为 null,设置动画的可见性,但实际上没有任何帮助,因为帧数保持不变。我必须找到一种解决方法来删除所有帧并添加新帧或将整个动画重置为默认状态。

第 1 步 - 初始化动画(起始帧索引为 0)

timerView.setBackgroundResource(R.drawable.timer_switch);
timerAnimation = (AnimationDrawable)timerView.getBackground();

System.out.println("Number of frames: " + timerAnimation.getNumberOfFrames());

for (int frameIndex = startingFrameIndex; frameIndex < 60; frameIndex++) {
    if (frameIndex < 10) {
        uri = "drawable/timer_0000" + frameIndex;
    } else {
        uri = "drawable/timer_000" + frameIndex;
    }

    imageResourceId = getResources().getIdentifier(uri, null, getPackageName());
    timerAnimation.addFrame(getResources().getDrawable(imageResourceId), timerImageFrameDuration);
}

第 2 步 - 这是我不知道该怎么做的棘手部分。我尝试过的事情:

timerAnimation.stop();
timerAnimation.setCallback(null);
timerAnimation.setVisibility(true, false);
timerAnimation = null;

第 3 步 - 调用第 2 步后,我再次调用第 1 步,但 Sys.out 仍显示 60 作为当前帧数。 (此处的起始索引设置为点击暂停按钮时的最后一个隐藏帧。)

欢迎任何想法。

谢谢

【问题讨论】:

标签: android animation frame drawable


【解决方案1】:

这将在调用stop() 后立即将(AnimationDrawable)timerAnimation 发送到第一帧:

timerAnimation.stop();
timerAnimation.selectDrawable(0);

【讨论】:

  • IMO,这个解决方案比公认的答案好得多,也便宜得多。
【解决方案2】:

我遇到了同样的问题,即停止动画会在当前帧停止。我希望它表现得像 iOS,停止会回到第一帧。这个解决方案对我有用:

((AnimationDrawable)(someButton.getBackground())).stop();
someButton.setBackgroundDrawable(null);
someButton.setBackgroundResource(R.drawable.animation);

这首先停止它(可能没有必要)。然后它会杀死背景动画。最后,它重新创建了背景。

【讨论】:

    【解决方案3】:

    另一种可能的解决方案是让第一帧和最后一帧的图像相同,然后执行以下操作,而不是调用 stop() 方法。

    ((AnimationDrawable)(someButton.getBackground())).setOneShot(true);
    

    如果有人确实对此进行了进一步调查。还有一个方法叫做 setVisible(boolean visible, boolean restart)。但是,这对我自己不起作用。

    【讨论】:

      【解决方案4】:

      你可以试试public boolean setVisible (boolean visible, boolean restart),它会播放一次动画。例如:

      animationDrawable.setVisible(false, true);
      

      【讨论】:

        【解决方案5】:

        我会setVisibility(true, true):

        timerAnimation.stop();
        timerAnimation.setVisibility(true, true);
        
        • visible boolean: 如果可见则为真,否则为假
        • restart 布尔值: 当可见时,true强制动画从第一帧重新开始

        【讨论】:

          【解决方案6】:

          android.view.animation.Animation.reset() 不起作用?

          【讨论】:

          • 这是一个 AnimationDrawable 不是一个动画,所以这不是一个选项
          猜你喜欢
          • 2013-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-09
          • 2015-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多