有一段时间没有更新博客了,最近过的也是浑浑噩噩的,不知道每天都在干什么,以后会正常更新博客。

gif在android中还是比较流行,所以最近研究了一下加载Gif动画,看了许多大神的博客和源码,这里就借花献佛,加载gif动画,我使用了三种方式,分别是:

1.自定义控件加载gif动画

2.使用Glide加载gif动画

3.使用android-gif-drawable加载gif动画

下面看一下演示的效果:

下面我就分别来说一下这三种方式:

1.自定义控件加载gif动画

①.首先自定义一个GifView,用于显示Gif图片,具体代码如下:

public class GifView extends View {private Resources resources;private Movie mMovie;private long mMovieStart;private float ratioWidth;private float ratioHeight;public GifView(Context context) {this(context,null);}public GifView(Context context, @Nullable AttributeSet attrs) {this(context, attrs,0);}public GifView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {setLayerType(View.LAYER_TYPE_SOFTWARE, null);}resources = context.getResources();TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.GifView);int resourceId = ta.getResourceId(R.styleable.GifView_src, -1);setGifResource(resourceId);ta.recycle();}public void setGifResource(int resourceId) {if (resourceId==-1){return;}InputStream is = resources.openRawResource(resourceId);mMovie = Movie.decodeStream(is);requestLayout();}public  void setGifStream(InputStream is){mMovie = Movie.decodeStream(is);requestLayout();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);if (mMovie!=null){int w = mMovie.width();int h = mMovie.height();if (w<=0){w=1;}if (h<=0){h=1;}int pLeft = getPaddingLeft();int pRight = getPaddingRight();int pTop = getPaddingTop();int pBottom = getPaddingBottom();int widthSize;int heightSize;w+=pLeft+pRight;h+=pTop+pBottom;w=Math.max(w,getSuggestedMinimumWidth());h=Math.max(h,getSuggestedMinimumHeight());widthSize= resolveSizeAndState(w,widthMeasureSpec,0);heightSize= resolveSizeAndState(h,heightMeasureSpec,0);ratioWidth = (float) widthSize/w;ratioHeight = (float) heightSize/h;setMeasuredDimension(widthSize,heightSize);}else{super.onMeasure(widthMeasureSpec, heightMeasureSpec);}}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);long now = SystemClock.uptimeMillis();if (mMovieStart ==0){ //第一次进入mMovieStart =now;}if (mMovie!=null){int dur = mMovie.duration();if (dur==0){dur=1000;}int relTime= (int) ((now-mMovieStart)%dur);mMovie.setTime(relTime);//  mMovie.draw(canvas,0,0);float scale=Math.min(ratioWidth,ratioHeight);canvas.scale(scale,scale);mMovie.draw(canvas,0,0);invalidate();}}
}

②.在布局文件中添加自定义的控件,我这加了两个,第一个展示assets文件中的gif图片,一个展示drawable中的gif图片

 <com.example.wen.adroid.view.GifViewandroid:id="@+id/gv_photo"android:layout_width="match_parent"android:layout_weight="1"android:layout_gravity="center"android:layout_height="0dp"/><com.example.wen.adroid.view.GifViewandroid:id="@+id/gv_local_photo"android:layout_width="match_parent"android:layout_weight="1"android:layout_gravity="center"android:layout_height="0dp"app:src="@drawable/gifphoto"/>

③.展示gif图片,具体代码如下:

         //方法一 使用自定义gifview播放gif图片mGvLocalPhoto = (GifView) findViewById(R.id.gv_local_photo);mGvPhoto = (GifView) findViewById(R.id.gv_photo);try {InputStream is = getAssets().open("assetphoto.gif");mGvPhoto.setGifStream(is);} catch (IOException e) {e.printStackTrace();}

2.使用Glide加载gif图片

Glide 地址: https://github.com/bumptech/glide

①.首先配置build.gradle

 compile 'com.github.bumptech.glide:glide:3.7.0'

②.配置好Glide之后,然后通过基本的用法去加载,加载代码如下:

// 方法二  使用Glide播放gif图片mIvPhoto = (ImageView) findViewById(R.id.iv_photo);Glide.with(this).load(R.drawable.gifphoto).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(mIvPhoto);

注意:diskCacheStrategy是为其添加缓存策略,其中缓存策略可以为:Source及None,None及为不缓存,Source缓存原型。

3.使用android-gif-drawable加载gif图片

android-gif-drawable 地址:https://github.com/koral--/android-gif-drawable

①.首先配置build.gradle

compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.7'

②.在xml中添加GifImageView控件

<pl.droidsonroids.gif.GifImageViewandroid:id="@+id/giv_photo"android:layout_width="match_parent"android:layout_weight="1"android:layout_height="0dp"android:src="@drawable/gifphoto"/>

③.调用android-gif-drawable

 //方法三 使用android-gif-drawable 库GifImageView mGifIvPhoto = (GifImageView) findViewById(R.id.giv_photo);try {//加载asset文件中的gif图片GifDrawable gif = new GifDrawable(getAssets(), "assetphoto.gif");mGifIvPhoto.setImageDrawable(gif);} catch (IOException e) {e.printStackTrace();}

总结

三种方式各有各的优缺点,根据自己去选择适合自己的方式去加载gif图片

下载方式

CSDN

https://download.csdn.net/download/wen_haha/10707972

Github

https://github.com/kongkongdaren/AndroidGifDemo

Android中加载Gif动画相关推荐

  1. Android中加载事件的方式

    Android中加载事件的方式 通过内部类的方式实现 通过外部类的方式实现 通过属性的方式实现 通过自身实现接口的方式实现 通过内部类的方式实现 Demo btn_Login.setOnClickLi ...

  2. 浅谈android中加载高清大图及图片压缩方式(二)

    这一讲就是本系列的第二篇,一起来聊下关于android中加载高清大图的问题,我们都知道如果我们直接加载原图的话,一个是非常慢,需要等待一定时间,如果没有在一定的时间内给用户响应的话,将会极大影响用户的 ...

  3. android实现加载等待动画,【Android 基础】Progressbar 实现Loading动画

    image.png Progressbar 实现Loading动画 网络加载,播放视频 loading 时候界面会显示 转圈 等待提示动画,使用Android 自带的Progressbar 即可实现, ...

  4. Android 中加载网络资源时的优化 缓存和异步机制

    网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制 ...

  5. android中加载Gif图片

           很多时候由于项目的需要,我们需要加载Gif的图片,实现动画效果,但是android本身并不支持直接加载Gif图片.因此网络上出现了很多关于android加载Gif图片的框架.今天在这里就 ...

  6. android glide加载webp动画设置播放动画次数和监听动画播放完成

    需求 产品经理说:需要使用一系列的动画,我说没问题啊,用gif图不就好了吗?结果,设计师给了我一系列的webp动图.我能怎么办? 先是百度了一番,找到了一个播放webp动画的glide库,库地址是Gl ...

  7. android jar 加入图片,Android动态加载外部jar包及jar包中图片等资源文件

    Android动态加载外部jar包及jar包中图片等资源文件 Android应用程序由Java开发,因此Java中许多实用的特性,在Android中也有体现.动态加载Class,也就是外部jar包,在 ...

  8. android刷新时的圆形动画_Android自定义加载圈动画效果

    本文实例为大家分享了Android自定义加载圈动画展示的具体代码,供大家参考,具体内容如下 实现如下效果: 该效果图主要有3个动画: 1.旋转动画 2.聚合动画 3.扩散动画 以上3个动画都是通过Va ...

  9. Android图片加载库:最全面解析Glide用法

    目录 1. 简介 介绍:Glide,是Android中一个图片加载开源库 Google的开源项目 主要作用:实现图片加载 2. 功能特点 2.1 功能列表 从上面可以看出,Glide不仅实现了图片异步 ...

  10. Android高效加载大图、多图解决方案,有效避免程序内存溢出现象

    好久没有写博客了,今天就先写一个小的关于在Android中加载大图如何避免内存溢出的问题. 后面会写如何使用缓存技术的核心类,android.support.v4.util.LruCache来加载图片 ...

最新文章

  1. 快速交付 敏捷开发的特点_什么是敏捷开发?它有什么特点
  2. HTTP Server开发相关学习资料整理推介
  3. 1、初识Server API for JavaScript
  4. 把剪贴板里面的数据放到内表
  5. java 读取word书签_Java 添加、读取、删除Word书签
  6. 17家银行工资单:招行人均45万夺冠
  7. Django Step by Step中文版,推荐一下
  8. 2019-03-14-算法-进化(移动零)
  9. 主题:的中间层框架 第一节
  10. Linux内存管理(最透彻的一篇)
  11. 龙芯笔记本可能以闹剧收场
  12. 配置WIN2003远程桌面的客户端连接数
  13. [Hive] - Hive参数含义详解
  14. iOS 开发笔记-plist使用
  15. 去除datatable列中重复的值
  16. ADB连接手机的三种方式USB、WLAN、WIFI
  17. 模式识别与机器学习 第一章 绪论
  18. 最新版校园招聘进大厂系列----------(3)字节篇 -----未完待续
  19. Wordress博客添加音乐播放器插件
  20. Fiddler过滤器Filterset的使用

热门文章

  1. easyMule-VeryCD-src---VS2010调试笔记
  2. 电脑系统及软件安装日期查看
  3. [Linux基础]读书笔记-老男孩核心系统命令实战1
  4. 淘淘商城第27讲——实现图片上传功能
  5. ROS学习—【在solidworks环境中将六自由度机械臂转换为URDF模型】
  6. gem5源码解读se.py以及simulate.py(一)
  7. [渝粤教育] 南阳理工学院 大学计算机基础 参考 资料
  8. java 爬虫处理数据_Java语言实现爬虫实战
  9. 地理空间数据云下载的DEM数据拼接问题
  10. 各省12.5m的Alos DEM数据的制作与分享