如何在Android中暂停和重新启动动画?

时间:2014-04-02 05:30:14

标签: android animation

任何人都可以告诉我如何在Android中暂停和重新启动动画。

动画XML是:

 <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="500%" android:toXDelta="0%"
           android:fromYDelta="0%" android:toYDelta="0%"
           android:duration="10000" 
            android:fillAfter="true"
              android:repeatCount="infinite"/>
</set>

代码是:

     Animation am=AnimationUtils.loadAnimation(this, R.anim.note);
      music1.startAnimation(am);

2 个答案:

答案 0 :(得分:0)

在API级别11中没有用于暂停/恢复动画的支持API。这些功能已在API级别19中添加。

您需要做的是为您要使用的动画类型创建子类,然后添加用于暂停和恢复动画的方法。以下是AlphaAnimation的示例:

public class PausableAlphaAnimation extends AlphaAnimation {

    private long mElapsedAtPause=0;
    private boolean mPaused=false;

    public PausableAlphaAnimation(float fromAlpha, float toAlpha) {
        super(fromAlpha, toAlpha);
    }

    @Override
    public boolean getTransformation(long currentTime, Transformation outTransformation) { 
        if(mPaused && mElapsedAtPause==0) {
            mElapsedAtPause=currentTime-getStartTime();
        }
        if(mPaused)
            setStartTime(currentTime-mElapsedAtPause);
        return super.getTransformation(currentTime, outTransformation);
    }

    public void pause() {
        mElapsedAtPause=0;
        mPaused=true;
    }

    public void resume() {
        mPaused=false;
    }
}

这将在动画暂停时不断增加你的开始时间,有效地防止它完成并保持它暂停时的​​状态。

希望它有所帮助。

答案 1 :(得分:0)

在开始动画后,你只有呼叫暂停和恢复方法。

公共类TranslateAnim扩展了TranslateAnimation {

    public TranslateAnim(float fromXDelta, float toXDelta, float fromYDelta,
            float toYDelta) {
        super(fromXDelta, toXDelta, fromYDelta, toYDelta);
        // TODO Auto-generated constructor stub
    }

    private long mElapsedAtPause=0;
    private boolean mPaused=false;

    @Override
    public boolean getTransformation(long currentTime, Transformation outTransformation) {
        if(mPaused && mElapsedAtPause==0) {
            mElapsedAtPause=currentTime-getStartTime();
        }
        if(mPaused)
            setStartTime(currentTime-mElapsedAtPause);
        return super.getTransformation(currentTime, outTransformation);
    }

    public void pause() {
        mElapsedAtPause=0;
        mPaused=true;
    }

    public void resume() {
        mPaused=false;
    }