本系列文章以koral实现的GIF文件native渲染为根据,解读实现的大致过程以及关键代码分析,github地址:https://github.com/koral–/android-gif-drawable。
本文实现的方案主要是通过自定义Drawable和自定义view来实现,这样既可以通过XML设置自定义Drawable,也可以通过代码设置自定义Drawable,从而可以在自定义view里渲染GIF文件。
(1)整体类结构
为了可以复用Drawable,引入GifDrawableBuilder类,同时使用策略模式使得不同形式的GIF资源都能通过build方法生成对应的GifDrawable对象。整体的UML类图如下:
(2)自定义View
以自定义ImageView为例,代码逻辑也比较简单,直接上关键代码:
@Override
public void setImageURI(Uri uri) {
if (!GifViewUtils.setGifImageUri(this, uri)) {
super.setImageURI(uri);
}
}
@Override
public void setImageResource(int resId) {
if (!GifViewUtils.setResource(this, true, resId)) {
super.setImageResource(resId);
}
}
@Override
public void setBackgroundResource(int resId) {
if (!GifViewUtils.setResource(this, false, resId)) {
super.setBackgroundResource(resId);
}
}