Android 上展示 GIF 动图的方法

1372

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

1. 使用 ImageView 加载 WebP 格式

具体用法

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

android: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 {

@Override

public void onCreate() {

super.onCreate();

Fresco.initialize(this);

}

}

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

android: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:

android: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();

}

@Override

protected 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. 使用 AnimatedImageDrawable 和 ImageDecoder

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

具体用法

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

android:id="@+id/imageView"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

在代码中使用 ImageDecoder 和 AnimatedImageDrawable:

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 图片的方式多种多样,各有优缺点:

使用 ImageView 加载 WebP 格式:

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

使用 Glide:

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

使用 Fresco:

优点:支持多种图片格式,高效的内存和磁盘缓存管理。缺点:库较大,学习曲线较陡。

使用 android-gif-drawable:

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

使用 Movie 类:

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

使用 AnimatedImageDrawable 和 ImageDecoder:

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

参考文献:

https://blog.csdn.net/chennai1101/article/details/127733528

https://www.jianshu.com/p/b19cbbf52385