• android 设置动态图片


    本文章转自http://blog.csdn.net/loongggdroid/article/details/21166563

    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();
        }
    public class MainActivity extends AppCompatActivity {
        private GifView gif1, gif2;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
            gif1 = (GifView) findViewById(R.id.gif1);
            // 设置背景gif图片资源
            gif1.setMovieResource(R.raw.dtt);
            gif2 = (GifView) findViewById(R.id.gif2);
            gif2.setMovieResource(R.raw.dtt);
            // 设置暂停
            // gif2.setPaused(true);
    
        }
    }




    <com.example.myapplication.GifView android:id="@+id/gif1" android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center_horizontal"/> <com.example.myapplication.GifView android:id="@+id/gif2" android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="center_horizontal"/>

      

    在values文件下styles写入
    
    
    
    
      <!-- GIF动画所用 -->
        <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>
    

      

  • 相关阅读:
    80端口被系统占用
    一些CSS技巧
    js 字符串日期 转成 Date
    mysql: java.sql.SQLException: Incorrect string value: 'xF0x9Fx92x90</...'
    tomcat升级问题
    [转]一个商业计划书模板
    [前端]利用a标签获取url里所需的内容
    回归研发一线
    在程序中打开浏览器(方法1)
    在活动之间切换(显式Intent)
  • 原文地址:https://www.cnblogs.com/yudada/p/7940378.html
Copyright © 2020-2023  润新知