广告
返回顶部
首页 > 资讯 > 精选 >Android 显示GIF图片实例详解
  • 337
分享到

Android 显示GIF图片实例详解

androidgif图片roi 2023-05-31 02:05:28 337人浏览 独家记忆
摘要

Android 显示GIF图片实例详解gif图动画在Android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个。经过我多方的搜索资料和整理,终于弄出来了,其实GitHub上有很多开源的gif的展示代

Android 显示GIF图片实例详解

gif图动画在Android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个。经过我多方的搜索资料和整理,终于弄出来了,其实GitHub上有很多开源的gif的展示代码,我下载过几个,但是都不是很理想,不是我完全想要的。所以有时候就得自己学会总结,把开源的东西整理成自己的,现在无聊,也正好有朋友需要,所以现在整理了一下,留着以后备用!

废话不多说,直接上图:

Android 显示GIF图片实例详解

Android 显示GIF图片实例详解

在这里主要用的是:android中的android.graphics.Movie 这个类,这是android提供给我们的一个非常方便的工具
首先,重写控件View,自定义一个展示gif图的GifView,代码如下:

package net.loonggg.gif.view;  import net.loonggg.gif.R; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.canvas; import android.graphics.Movie; import android.os.Build; import android.util.AttributeSet; import android.view.View;  public class GifView extends View {       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));     }   }       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();   }       public void setPaused(boolean paused) {     this.mPaused = paused;     if (!paused) {       mMovieStart = android.os.SystemClock.uptimeMillis()           - mCurrentAnimationTime;     }     invalidate();   }       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();   }  } 

--结束END--

本文标题: Android 显示GIF图片实例详解

本文链接: https://www.lsjlt.com/news/222947.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作