zoukankan      html  css  js  c++  java
  • Android下加载GIF图片

    你来使用glide是可以直接加载的,但是公司没有用这个框架。

    然后在网上找了一个自定义view加载,感觉还不错。

    代码如下:

    public class GifView extends View {
    
        /**
         * 默认为1秒
         */
        private static final int DEFAULT_MOVIE_DURATION = 1000;
    
        private int mMovieResourceId;
    
        private Movie mMovie;
    
        private long mMovieStart;
    
        private int mCurrentAnimationTime = 0;
    
        private float mLeft;
    
        private float mTop;
    
        private float mScale;
    
        private int mMeasuredMovieWidth;
    
        private int mMeasuredMovieHeight;
    
        private boolean mVisible = true;
    
        private volatile boolean mPaused = false;
    
        public GifView(Context context) {
            this(context, null);
        }
    
        public GifView(Context context, AttributeSet attrs) {
            this(context, attrs, R.styleable.CustomTheme_gifViewStyle);
        }
    
        public GifView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            setViewAttributes(context, attrs, defStyle);
        }
    
        @SuppressLint("NewApi")
        private void setViewAttributes(Context context, AttributeSet attrs,
                                       int defStyle) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                setLayerType(View.LAYER_TYPE_SOFTWARE, null);
            }
            // 从描述文件中读出gif的值,创建出Movie实例
            final TypedArray array = context.obtainStyledAttributes(attrs,
                    R.styleable.GifView, defStyle, R.style.Widget_GifView);
            mMovieResourceId = array.getResourceId(R.styleable.GifView_gif, -1);
            mPaused = array.getBoolean(R.styleable.GifView_paused, false);
            array.recycle();
            if (mMovieResourceId != -1) {
                mMovie = Movie.decodeStream(getResources().openRawResource(
                        mMovieResourceId));
            }
        }
    
        /**
         * 设置gif图资源
         *
         * @param movieResId
         */
        public void setMovieResource(int movieResId) {
            this.mMovieResourceId = movieResId;
            mMovie = Movie.decodeStream(getResources().openRawResource(
                    mMovieResourceId));
            requestLayout();
        }
    
        public void setMovie(Movie movie) {
            this.mMovie = movie;
            requestLayout();
        }
    
        public Movie getMovie() {
            return mMovie;
        }
    
        public void setMovieTime(int time) {
            mCurrentAnimationTime = time;
            invalidate();
        }
    
        /**
         * 设置暂停
         *
         * @param paused
         */
        public void setPaused(boolean paused) {
            this.mPaused = paused;
            if (!paused) {
                mMovieStart = android.os.SystemClock.uptimeMillis()
                        - mCurrentAnimationTime;
            }
            invalidate();
        }
    
        /**
         * 判断gif图是否停止了
         *
         * @return
         */
        public boolean isPaused() {
            return this.mPaused;
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            if (mMovie != null) {
                int movieWidth = mMovie.width();
                int movieHeight = mMovie.height();
                int maximumWidth = MeasureSpec.getSize(widthMeasureSpec);
                float scaleW = (float) movieWidth / (float) maximumWidth;
                mScale = 1f / scaleW;
                mMeasuredMovieWidth = maximumWidth;
                mMeasuredMovieHeight = (int) (movieHeight * mScale);
                setMeasuredDimension(mMeasuredMovieWidth, mMeasuredMovieHeight);
            } else {
                setMeasuredDimension(getSuggestedMinimumWidth(),
                        getSuggestedMinimumHeight());
            }
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            super.onLayout(changed, l, t, r, b);
            mLeft = (getWidth() - mMeasuredMovieWidth) / 2f;
            mTop = (getHeight() - mMeasuredMovieHeight) / 2f;
            mVisible = getVisibility() == View.VISIBLE;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            if (mMovie != null) {
                if (!mPaused) {
                    updateAnimationTime();
                    drawMovieFrame(canvas);
                    invalidateView();
                } else {
                    drawMovieFrame(canvas);
                }
            }
        }
    
        @SuppressLint("NewApi")
        private void invalidateView() {
            if (mVisible) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    postInvalidateOnAnimation();
                } else {
                    invalidate();
                }
            }
        }
    
        private void updateAnimationTime() {
            long now = android.os.SystemClock.uptimeMillis();
            // 如果第一帧,记录起始时间
            if (mMovieStart == 0) {
                mMovieStart = now;
            }
            // 取出动画的时长
            int dur = mMovie.duration();
            if (dur == 0) {
                dur = DEFAULT_MOVIE_DURATION;
            }
            // 算出需要显示第几帧
            mCurrentAnimationTime = (int) ((now - mMovieStart) % dur);
        }
    
        private void drawMovieFrame(Canvas canvas) {
            // 设置要显示的帧,绘制即可
            mMovie.setTime(mCurrentAnimationTime);
            canvas.save(Canvas.MATRIX_SAVE_FLAG);
            canvas.scale(mScale, mScale);
            mMovie.draw(canvas, mLeft / mScale, mTop / mScale);
            canvas.restore();
        }
    
        @SuppressLint("NewApi")
        @Override
        public void onScreenStateChanged(int screenState) {
            super.onScreenStateChanged(screenState);
            mVisible = screenState == SCREEN_STATE_ON;
            invalidateView();
        }
    
        @SuppressLint("NewApi")
        @Override
        protected void onVisibilityChanged(View changedView, int visibility) {
            super.onVisibilityChanged(changedView, visibility);
            mVisible = visibility == View.VISIBLE;
            invalidateView();
        }
    
        @Override
        protected void onWindowVisibilityChanged(int visibility) {
            super.onWindowVisibilityChanged(visibility);
            mVisible = visibility == View.VISIBLE;
            invalidateView();
        }
    
    }

    自定义控件怎么用就不说了。

    然后在需要播放的地方这样写:

    先findviewbyid找到这个控件。然后
       gif.setMovieResource(R.raw.ic_launcher);//里面的id就是你的GIF的id
    

    还有一些其他使用,比如暂停, 自己研究吧。

    需要其他用到的、

       <declare-styleable name="GifView">
            <attr name="gif" format="reference" />
            <attr name="paused" format="boolean" />
        </declare-styleable>
        <declare-styleable name="CustomTheme">
            <attr name="gifViewStyle" format="reference" />
        </declare-styleable>

    这个我给的空,大家随便吧

        <style name="Widget_GifView"> </style>
    

      

    希望对大家工作学习有帮助!谢谢

  • 相关阅读:
    scala学习资料
    maven安装scala插件
    关于 mod_python
    Python读取Excel数据
    Python展开一个嵌套的序列
    随手写的Java向文本文件写字符串的类
    Python三元表达式
    递归的概述
    一分钟让你明白CSS中的盒模型
    Python实现ID3算法
  • 原文地址:https://www.cnblogs.com/itpepe/p/4866306.html
Copyright © 2011-2022 走看看