如何动态更改Android AnimationDrawable动画的持续时间?

时间:2010-12-06 21:24:19

标签: android

我是Android平台的新手。我正在使用以下内容在我的应用程序中使用AminationDrawable为一组16个“框架”制作动画:

在XML文件中我有:

<animation-list 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:oneshot="false">
<item android:drawable="@drawable/image_1" android:duration="200" />
<item android:drawable="@drawable/image_1_25" android:duration="200" /> 
<item android:drawable="@drawable/image_1_5" android:duration="200" />
<item android:drawable="@drawable/image_1_75" android:duration="200" /> 
<item android:drawable="@drawable/image_2" android:duration="200" />
<item android:drawable="@drawable/image_2_25" android:duration="200" /> 
<item android:drawable="@drawable/image_2_5" android:duration="200" />
<item android:drawable="@drawable/image_2_75" android:duration="200" />
<item android:drawable="@drawable/image_3" android:duration="200" />
<item android:drawable="@drawable/image_3_25" android:duration="200" /> 
<item android:drawable="@drawable/image_3_5" android:duration="200" />
<item android:drawable="@drawable/image_3_75" android:duration="200" />
<item android:drawable="@drawable/image_4" android:duration="200" />
<item android:drawable="@drawable/image_4_25" android:duration="200" /> 
<item android:drawable="@drawable/image_4_5" android:duration="200" />
<item android:drawable="@drawable/image_4_75" android:duration="200" /> 
</animation-list>

在Java代码中,我有以下

首先我宣布该课程并在我设置动画时添加onCreate()方法。

public class MyNewActivity extends Activity 
{
    // member variables (accessible from within class methods below).
    AnimationDrawable mainAnimation;
    long mSpeed = 50;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_widget);
        // set up image
        ImageView mainImage = (ImageView) findViewById(R.id.image_widget);
        mainImage.setBackgroundResource(R.drawable.animated_image);
        mainAnimation = (AnimationDrawable) mainImage.getBackground();
    };
<...snip...>

...然后我在用户按下按钮时开始绘图我调用以下内容开始动画移动:

private void start()
{
    // start the image rotating.
    if (mainAnimation.isRunning())
        mainAnimation.stop();

    int numFrames = mainAnimation.getNumberOfFrames();
    for (int ii = 0; ii < numFrames; ii++ )
    {
        // change the animation speed.
        Drawable d = mainAnimation.getFrame(ii);
        mainAnimation.scheduleDrawable(d, mainAnimation, mSpeed);
    }
}
<...snip...>

所以代码中的其他地方我可以调整成员变量mSpeed。如果我这样做然后调用start(),动画将开始,但速度总是相同的(基本上是在上面的XML中定义的。我的问题是,如何修改帧的“持续时间”)根据用户输入更快/更慢地移动这个动画?我看不到修改“持续时间”状态的方法,并假设上面的ScheduleDrawable()调用会改变绘图的帧持续时间。

1 个答案:

答案 0 :(得分:20)

我遇到了同样的问题但是我通过实现我自己的AnimationDrawable类来扩展AnimationDrawable并覆盖Run()方法并添加setDuration()方法时,设法解决了这个问题,同时阅读了AnimationDrawable的source code这允许我设置持续时间如下:

通过查看原始的run方法,我们看到它执行相同的操作但是通过在添加帧时指定的持续时间调用scheduleSelf(this, SystemClock.uptimeMillis() + duration);,所以我更改了它。我还添加了持续时间,因为我对所有帧使用相同但你可以使用新持续时间的数组。

import android.graphics.drawable.AnimationDrawable;
import android.os.SystemClock;

public class MyAnimationDrawable extends AnimationDrawable {

    private volatile int duration;//its volatile because another thread will update its value
    private int currentFrame;

    public MyAnimationDrawable() {
        currentFrame = 0;
    }

    @Override
    public void run() {
        int n = getNumberOfFrames();
        currentFrame++;
        if (currentFrame >= n) {
            currentFrame = 0;
        }
        selectDrawable(currentFrame);
        scheduleSelf(this, SystemClock.uptimeMillis() + duration);
    }

    public void setDuration(int duration) {
        this.duration = duration;
        //we have to do the following or the next frame will be displayed after the old duration
        unscheduleSelf(this);
        selectDrawable(currentFrame);
        scheduleSelf(this, SystemClock.uptimeMillis()+duration);
    }
}

这是我的第一个答案,所以我希望它对你有所帮助,而且解释得很好。