亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Android AnimationDrawable并知道動畫何時結束

Android AnimationDrawable并知道動畫何時結束

滄海一幻覺 2019-12-13 15:10:52
我想用幾個圖像文件制作一個動畫,為此,AnimationDrawable效果很好。但是,我需要知道動畫何時開始以及何時結束(即添加諸如Animation.AnimationListener之類的偵聽器)。搜索答案后,我很難過AnimationDrawable不支持偵聽器。有誰知道如何在Android上使用偵聽器創建逐幀圖像動畫?
查看完整描述

3 回答

?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

我需要知道一次完成的AnimationDrawable何時完成,而不必將AnimationDrawable子類化,因為我必須以XML設置動畫列表。我寫了這個課,并在Gingerbread和ICS上進行了測試。它可以很容易地擴展以在每個幀上提供回調。


/**

 * Provides a callback when a non-looping {@link AnimationDrawable} completes its animation sequence. More precisely,

 * {@link #onAnimationComplete()} is triggered when {@link View#invalidateDrawable(Drawable)} has been called on the

 * last frame.

 * 

 * @author Benedict Lau

 */

public abstract class AnimationDrawableCallback implements Callback {


    /**

     * The last frame of {@link Drawable} in the {@link AnimationDrawable}.

     */

    private Drawable mLastFrame;


    /**

     * The client's {@link Callback} implementation. All calls are proxied to this wrapped {@link Callback}

     * implementation after intercepting the events we need.

     */

    private Callback mWrappedCallback;


    /**

     * Flag to ensure that {@link #onAnimationComplete()} is called only once, since

     * {@link #invalidateDrawable(Drawable)} may be called multiple times.

     */

    private boolean mIsCallbackTriggered = false;


    /**

     * 

     * @param animationDrawable

     *            the {@link AnimationDrawable}.

     * @param callback

     *            the client's {@link Callback} implementation. This is usually the {@link View} the has the

     *            {@link AnimationDrawable} as background.

     */

    public AnimationDrawableCallback(AnimationDrawable animationDrawable, Callback callback) {

        mLastFrame = animationDrawable.getFrame(animationDrawable.getNumberOfFrames() - 1);

        mWrappedCallback = callback;

    }


    @Override

    public void invalidateDrawable(Drawable who) {

        if (mWrappedCallback != null) {

            mWrappedCallback.invalidateDrawable(who);

        }


        if (!mIsCallbackTriggered && mLastFrame != null && mLastFrame.equals(who.getCurrent())) {

            mIsCallbackTriggered = true;

            onAnimationComplete();

        }

    }


    @Override

    public void scheduleDrawable(Drawable who, Runnable what, long when) {

        if (mWrappedCallback != null) {

            mWrappedCallback.scheduleDrawable(who, what, when);

        }

    }


    @Override

    public void unscheduleDrawable(Drawable who, Runnable what) {

        if (mWrappedCallback != null) {

            mWrappedCallback.unscheduleDrawable(who, what);

        }

    }


    //

    // Public methods.

    //


    /**

     * Callback triggered when {@link View#invalidateDrawable(Drawable)} has been called on the last frame, which marks

     * the end of a non-looping animation sequence.

     */

    public abstract void onAnimationComplete();

}

這是使用方法。


AnimationDrawable countdownAnimation = (AnimationDrawable) mStartButton.getBackground();

countdownAnimation.setCallback(new AnimationDrawableCallback(countdownAnimation, mStartButton) {

    @Override

    public void onAnimationComplete() {

        // TODO Do something.

    }

});

countdownAnimation.start();



查看完整回答
反對 回復 2019-12-14
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

通過重寫AnimationDrawable類中的selectDrawable方法,可以輕松跟蹤動畫結束。完整的代碼如下:


public class AnimationDrawable2 extends AnimationDrawable

{

    public interface IAnimationFinishListener

    {

        void onAnimationFinished();

    }


    private boolean finished = false;

    private IAnimationFinishListener animationFinishListener;


    public IAnimationFinishListener getAnimationFinishListener()

    {

        return animationFinishListener;

    }


    public void setAnimationFinishListener(IAnimationFinishListener animationFinishListener)

    {

        this.animationFinishListener = animationFinishListener;

    }


    @Override

    public boolean selectDrawable(int idx)

    {

        boolean ret = super.selectDrawable(idx);


        if ((idx != 0) && (idx == getNumberOfFrames() - 1))

        {

            if (!finished)

            {

                finished = true;

                if (animationFinishListener != null) animationFinishListener.onAnimationFinished();

            }

        }


        return ret;

    }

}



查看完整回答
反對 回復 2019-12-14
  • 3 回答
  • 0 關注
  • 438 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號