当前位置: 首页 > news >正文

Android 上展示 GIF 动图的方法

在 Android 开发中,展示 GIF 动图有多种方法,每种方法都有其优缺点。下面我们将介绍几种常见的方法,并比较它们的具体用法、优缺点。

1. 使用 ImageView 加载 WebP 格式
具体用法

WebP 是一种支持有损和无损压缩的图像格式,并且 Google 已经为 Android 提供了对 WebP 格式的支持。可以通过使用标准的 ImageView 来加载 WebP 动图。

<ImageViewandroid:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/animated_image.webp" />
优缺点

优点:

  • 易于使用,无需额外的库。
  • 支持透明度和更高的压缩比,节省存储空间。

缺点:

  • 并非所有 GIF 都能轻松转换为 WebP。
  • WebP 格式的支持需要 API Level 14 以上。
2. 使用 Glide

Glide 是一个强大的图片加载和缓存库,支持加载和显示 GIF 动图。

具体用法

首先,在项目的 build.gradle 文件中添加 Glide 的依赖:

implementation 'com.github.bumptech.glide:glide:4.x.x'
annotationProcessor 'com.github.bumptech.glide:compiler:4.x.x'

然后,可以使用如下代码加载 GIF 到 ImageView 中:

ImageView imageView = findViewById(R.id.imageView);
Glide.with(this).asGif().load("https://example.com/your_gif.gif").into(imageView);
优缺点

优点:

  • 强大的图片加载和缓存功能。
  • 易于与 RecyclerView 等视图结合使用。
  • 支持各种复杂的图像处理操作。

缺点:

  • 库的体积较大,可能增加 APK 的大小。
  • 相对于一些更轻量的解决方案,可能会带来一些性能开销。
3. 使用 Fresco

Fresco 是 Facebook 开源的图片加载库,支持 GIF 和 WebP 动图。

具体用法

首先,在项目的 build.gradle 文件中添加 Fresco 的依赖:

implementation 'com.facebook.fresco:fresco:2.x.x'

Application 类中初始化 Fresco:

public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();Fresco.initialize(this);}
}

然后,在布局文件中使用 SimpleDraweeView

<com.facebook.drawee.view.SimpleDraweeViewandroid:id="@+id/simpleDraweeView"android:layout_width="wrap_content"android:layout_height="wrap_content"fresco:placeholderImage="@drawable/your_placeholder" />

在代码中加载 GIF:

SimpleDraweeView draweeView = findViewById(R.id.simpleDraweeView);
draweeView.setImageURI(Uri.parse("https://example.com/your_gif.gif"));
优缺点

优点:

  • 支持大量图片格式,包括 GIF 和 WebP。
  • 高效的内存和磁盘缓存管理。
  • 支持渐进式 JPEG。

缺点:

  • 库相对较大,增加 APK 的大小。
  • 学习曲线稍陡峭,相比 Glide 更复杂一些。
4. 使用 android-gif-drawable

android-gif-drawable 是一个专门用于加载和显示 GIF 动图的库。

具体用法

首先,在项目的 build.gradle 文件中添加依赖:

implementation 'pl.droidsonroids.gif:android-gif-drawable:1.x.x'

然后,在布局文件中使用 GifImageView

<pl.droidsonroids.gif.GifImageViewandroid:id="@+id/gifImageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/your_gif.gif" />

或者在代码中加载 GIF:

GifImageView gifImageView = findViewById(R.id.gifImageView);
try {GifDrawable gifDrawable = new GifDrawable(getResources(), R.drawable.your_gif);gifImageView.setImageDrawable(gifDrawable);
} catch (IOException e) {e.printStackTrace();
}
优缺点

优点:

  • 专用于 GIF,功能丰富。
  • 支持暂停、恢复等控制功能。
  • 内存使用优化较好。

缺点:

  • 仅限于 GIF,不支持其他图片格式。
  • 额外引入一个第三方库,增加 APK 大小。
5. 使用 Movie

Movie 是 Android 自带的类,可以用来加载和播放 GIF 动画。

具体用法
Movie movie = Movie.decodeStream(getResources().openRawResource(R.raw.your_gif));
CustomGifView gifView = findViewById(R.id.customGifView);
gifView.setMovie(movie);

其中 CustomGifView 是一个自定义的 View 用于绘制 GIF。

public class CustomGifView extends View {private Movie mMovie;private long mMovieStart;public CustomGifView(Context context) {super(context);}public void setMovie(Movie movie) {this.mMovie = movie;invalidate();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (mMovie != null) {long now = android.os.SystemClock.uptimeMillis();if (mMovieStart == 0) {mMovieStart = now;}int relTime = (int)((now - mMovieStart) % mMovie.duration());mMovie.setTime(relTime);mMovie.draw(canvas, 10, 10);invalidate();}}
}
优缺点

优点:

  • 不需要额外的第三方库。
  • 非常轻量级。

缺点:

  • 功能有限,不支持复杂的 GIF 控制(如暂停、恢复)。
  • 性能和内存管理方面不如其他专业库。
6. 使用 AnimatedImageDrawableImageDecoder

AnimatedImageDrawableImageDecoder 是 Android 9.0 引入的用于绘制和显示 GIF 和 WebP 等动图的类。

具体用法

首先,在布局文件中使用 ImageView

<ImageViewandroid:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="wrap_content" />

在代码中使用 ImageDecoderAnimatedImageDrawable

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {ImageView imageView = findViewById(R.id.imageView);try {Source source = ImageDecoder.createSource(getResources(), R.drawable.your_gif);AnimatedImageDrawable drawable = (AnimatedImageDrawable) ImageDecoder.decodeDrawable(source);imageView.setImageDrawable(drawable);drawable.start();} catch (IOException e) {e.printStackTrace();}
}
优缺点

优点:

  • 原生支持,性能优化好。
  • 支持最新的图像格式和动画控制。

缺点:

  • 仅支持 Android 9.0 及以上版本。
  • 相对较新的 API,兼容性较低。

总结

展示 GIF 图片的方式多种多样,各有优缺点:

  1. 使用 ImageView 加载 WebP 格式

    • 优点:简单直接,节省存储空间。
    • 缺点:需要将 GIF 转换为 WebP,且 WebP 支持有限。
  2. 使用 Glide

    • 优点:强大的图片加载和缓存功能,支持复杂的图像处理。
    • 缺点:库较大,增加 APK 大小。
  3. 使用 Fresco

    • 优点:支持多种图片格式,高效的内存和磁盘缓存管理。
    • 缺点:库较大,学习曲线较陡。
  4. 使用 android-gif-drawable

    • 优点:专用于 GIF,功能丰富,内存使用优化较好。
    • 缺点:仅限于 GIF,不支持其他格式。
  5. 使用 Movie

    • 优点:不需要额外的第三方库,轻量级。
    • 缺点:功能有限,性能和内存管理不如其他专业库。
  6. 使用 AnimatedImageDrawableImageDecoder

    • 优点:原生支持,性能优化好,支持最新的图像格式和动画控制。
    • 缺点:仅支持 Android 9.0 及以上版本,兼容性较低。

参考文献:
https://blog.csdn.net/chennai1101/article/details/127733528
https://www.jianshu.com/p/b19cbbf52385

相关文章:

  • Stable Diffusion 3 Medium 模型
  • Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库
  • UnityAPI学习之延时调用(Invoke)
  • vscode中模糊搜索和替换
  • 如何使用asyncua模块在opcua的Server端添加值为列表的变量?
  • Office 2021 mac/win版:智慧升级,办公新风尚
  • 【大数据】计算引擎:Spark核心概念
  • L50--- 104. 二叉树的最大深度(深搜)---Java版
  • windows11 建立批处理bat文件来删除指定目录下的所有隐藏的文件。
  • mysql_ssl_rsa_setup使用详解
  • 【Mysql】 深入理解MySQL的执行计划
  • 【云原生】创建harbor私有仓库及使用aliyun个人仓库
  • 果园预售系统的设计
  • 生命在于学习——Python人工智能原理(3.3)
  • 解决浏览器缩放的时候,重新设置滚动条的位置,使页面滚动条固定悬浮在页面底部
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 2017前端实习生面试总结
  • JS函数式编程 数组部分风格 ES6版
  • MySQL QA
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 番外篇1:在Windows环境下安装JDK
  • 深入 Nginx 之配置篇
  • 微信支付JSAPI,实测!终极方案
  • 用jquery写贪吃蛇
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • puppet连载22:define用法
  • 容器镜像
  • 数据库巡检项
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • # Maven错误Error executing Maven
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (day18) leetcode 204.计数质数
  • (PADS学习)第二章:原理图绘制 第一部分
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (算法)Game
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ./和../以及/和~之间的区别
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 材料检测系统崩溃分析
  • .NET 给NuGet包添加Readme
  • .net程序集学习心得
  • .net实现客户区延伸至至非客户区
  • @Conditional注解详解
  • @DS 多数据源 + @Transactional(rollbackFor = Exception.class) 导致@DS 多数据源没法使用