美文网首页
动画效果

动画效果

作者: 勤劳的蚂蚁 | 来源:发表于2020-03-13 15:41 被阅读0次
    
    
    import android.widget.ImageView;
    
    public class FrameAnimation {
    
        private boolean mIsRepeat;
    
        private AnimationListener mAnimationListener;
    
        private ImageView mImageView;
    
        private int[] mFrameRess;
    
        /**
         * 每帧动画的播放间隔数组
         */
        private int[] mDurations;
    
        /**
         * 每帧动画的播放间隔
         */
        private int mDuration;
    
        /**
         * 下一遍动画播放的延迟时间
         */
        private int mDelay;
    
        private int mLastFrame;
    
        private boolean mNext;
    
        private boolean mPause;
    
        private int mCurrentSelect;
    
        private int mCurrentFrame;
    
        private static final int SELECTED_A = 1;
    
        private static final int SELECTED_B = 2;
    
        private static final int SELECTED_C = 3;
    
        private static final int SELECTED_D = 4;
    
    
        /**
         * @param iv       播放动画的控件
         * @param frameRes 播放的图片数组
         * @param duration 每帧动画的播放间隔(毫秒)
         * @param isRepeat 是否循环播放
         */
        public FrameAnimation(ImageView iv, int[] frameRes, int duration, boolean isRepeat) {
            this.mImageView = iv;
            this.mFrameRess = frameRes;
            this.mDuration = duration;
            this.mLastFrame = frameRes.length - 1;
            this.mIsRepeat = isRepeat;
            play(0);
        }
    
        /**
         * @param iv        播放动画的控件
         * @param frameRess 播放的图片数组
         * @param durations 每帧动画的播放间隔(毫秒)
         * @param isRepeat  是否循环播放
         */
        public FrameAnimation(ImageView iv, int[] frameRess, int[] durations, boolean isRepeat) {
            this.mImageView = iv;
            this.mFrameRess = frameRess;
            this.mDurations = durations;
            this.mLastFrame = frameRess.length - 1;
            this.mIsRepeat = isRepeat;
            playByDurations(0);
        }
    
        /**
         * 循环播放动画
         *
         * @param iv        播放动画的控件
         * @param frameRess 播放的图片数组
         * @param duration  每帧动画的播放间隔(毫秒)
         * @param delay     循环播放的时间间隔
         */
        public FrameAnimation(ImageView iv, int[] frameRess, int duration, int delay) {
            this.mImageView = iv;
            this.mFrameRess = frameRess;
            this.mDuration = duration;
            this.mDelay = delay;
            this.mLastFrame = frameRess.length - 1;
            playAndDelay(0);
        }
    
        /**
         * 循环播放动画
         *
         * @param iv        播放动画的控件
         * @param frameRess 播放的图片数组
         * @param durations 每帧动画的播放间隔(毫秒)
         * @param delay     循环播放的时间间隔
         */
        public FrameAnimation(ImageView iv, int[] frameRess, int[] durations, int delay) {
            this.mImageView = iv;
            this.mFrameRess = frameRess;
            this.mDurations = durations;
            this.mDelay = delay;
            this.mLastFrame = frameRess.length - 1;
            playByDurationsAndDelay(0);
        }
    
        private void playByDurationsAndDelay(final int i) {
            mImageView.postDelayed(new Runnable() {
    
                @Override
                public void run() {
                    if (mPause) {   // 暂停和播放需求
                        mCurrentSelect = SELECTED_A;
                        mCurrentFrame = i;
                        return;
                    }
                    if (0 == i) {
                        if (mAnimationListener != null) {
                            mAnimationListener.onAnimationStart();
                        }
                    }
                    mImageView.setBackgroundResource(mFrameRess[i]);
                    if (i == mLastFrame) {
                        if (mAnimationListener != null) {
                            mAnimationListener.onAnimationRepeat();
                        }
                        mNext = true;
                        playByDurationsAndDelay(0);
                    } else {
                        playByDurationsAndDelay(i + 1);
                    }
                }
            }, mNext && mDelay > 0 ? mDelay : mDurations[i]);
    
        }
    
        private void playAndDelay(final int i) {
            mImageView.postDelayed(new Runnable() {
    
                @Override
                public void run() {
                    if (mPause) {
                        if (mPause) {
                            mCurrentSelect = SELECTED_B;
                            mCurrentFrame = i;
                            return;
                        }
                        return;
                    }
                    mNext = false;
                    if (0 == i) {
                        if (mAnimationListener != null) {
                            mAnimationListener.onAnimationStart();
                        }
                    }
                    mImageView.setBackgroundResource(mFrameRess[i]);
                    if (i == mLastFrame) {
                        if (mAnimationListener != null) {
                            mAnimationListener.onAnimationRepeat();
                        }
                        mNext = true;
                        playAndDelay(0);
                    } else {
                        playAndDelay(i + 1);
                    }
                }
            }, mNext && mDelay > 0 ? mDelay : mDuration);
    
        }
    
        private void playByDurations(final int i) {
            mImageView.postDelayed(new Runnable() {
    
                @Override
                public void run() {
                    if (mPause) {
                        if (mPause) {
                            mCurrentSelect = SELECTED_C;
                            mCurrentFrame = i;
                            return;
                        }
                        return;
                    }
                    if (0 == i) {
                        if (mAnimationListener != null) {
                            mAnimationListener.onAnimationStart();
                        }
                    }
                    mImageView.setBackgroundResource(mFrameRess[i]);
                    if (i == mLastFrame) {
                        if (mIsRepeat) {
                            if (mAnimationListener != null) {
                                mAnimationListener.onAnimationRepeat();
                            }
                            playByDurations(0);
                        } else {
                            if (mAnimationListener != null) {
                                mAnimationListener.onAnimationEnd();
                            }
                        }
                    } else {
    
                        playByDurations(i + 1);
                    }
                }
            }, mDurations[i]);
    
        }
    
        private void play(final int i) {
            mImageView.postDelayed(new Runnable() {
    
                @Override
                public void run() {
                    if (mPause) {
                        if (mPause) {
                            mCurrentSelect = SELECTED_D;
                            mCurrentFrame = i;
                            return;
                        }
                        return;
                    }
                    if (0 == i) {
                        if (mAnimationListener != null) {
                            mAnimationListener.onAnimationStart();
                        }
                    }
                    mImageView.setBackgroundResource(mFrameRess[i]);
                    if (i == mLastFrame) {
    
                        if (mIsRepeat) {
                            if (mAnimationListener != null) {
                                mAnimationListener.onAnimationRepeat();
                            }
                            play(0);
                        } else {
                            if (mAnimationListener != null) {
                                mAnimationListener.onAnimationEnd();
                            }
                        }
    
                    } else {
    
                        play(i + 1);
                    }
                }
            }, mDuration);
        }
    
        public static interface AnimationListener {
    
            /**
             * <p>Notifies the start of the animation.</p>
             */
            void onAnimationStart();
    
            /**
             * <p>Notifies the end of the animation. This callback is not invoked
             * for animations with repeat count set to INFINITE.</p>
             */
            void onAnimationEnd();
    
            /**
             * <p>Notifies the repetition of the animation.</p>
             */
            void onAnimationRepeat();
        }
    
        /**
         * <p>Binds an animation listener to this animation. The animation listener
         * is notified of animation events such as the end of the animation or the
         * repetition of the animation.</p>
         *
         * @param listener the animation listener to be notified
         */
        public void setAnimationListener(AnimationListener listener) {
            this.mAnimationListener = listener;
        }
    
        public void release() {
            pauseAnimation();
        }
    
        public void pauseAnimation() {
            this.mPause = true;
        }
    
        public boolean isPause() {
            return this.mPause;
        }
    
        public void restartAnimation() {
            if (mPause) {
                mPause = false;
                switch (mCurrentSelect) {
                    case SELECTED_A:
                        playByDurationsAndDelay(mCurrentFrame);
                        break;
                    case SELECTED_B:
                        playAndDelay(mCurrentFrame);
                        break;
                    case SELECTED_C:
                        playByDurations(mCurrentFrame);
                        break;
                    case SELECTED_D:
                        play(mCurrentFrame);
                        break;
                    default:
                        break;
                }
            }
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:动画效果

          本文链接:https://www.haomeiwen.com/subject/kaelshtx.html