android-gif-drawable(https://github.com/koral--/android-gif-drawable/releases)开源项目---是一个蛮不错的android gif显示实现.本文在android-gif-drawable基础上介绍如何实现TextView、EditText上展示Gif动态图。
网上有蛮多介绍这个框架使用的文章,比如http://www.open-open.com/lib/view/open1404888098200.html。
核心类GifDrawable间隔一定时间读取下一帧数据,然后执行invalidateSelf()----》CallBack::invalidateDrawable()---》View::verifyDrawable()和View::invalidate(),该帧数据刷新流程就执行结束。
而android-gif-drawable框架目前已支持GifImageView、GifImageButton、GifTextView三个android widget,且
GifImageView、GifImageButton支持对src和backgroud设置Gif,而GifTextView对支持backgroud和CompoundDrawables设置Gif。
现在很多app都支持Gif表情,但貌似还没有一个app对输入框(等)支持GIF。而基本所有的表情图片(包括Emoji)都是使用ImageSpan实现的。但默认的ImageSpan是无法支持GIF的。
参考android-gif-drawable框架中gif帧数据刷新流程,要支持GIF需要考虑并完成下面三个操作:
1)对ImageSpan中的GifDrawable,何时设置其Callback,又何时清空该Callback,目前TextView、ImageSpan和Spaned都没有设置Callback的地方,我们需要找一个合适的地方将TextView设置为GifDrawable的Callback;
2)在TextView::invalidateDrawable()中实现对GifDrawable的校验,即验证该GifDrawable是TextView的内容,需要刷新;
3)在TextView::invalidateDrawable()中实现如何刷新TextView显示;
首先对于1),我们参考下ImageView和TextView实现。ImageView的src drawable对应实现如下:
/**
* Sets a drawable as the content of this ImageView.
*
* @param drawable The drawable to set
*/
public void setImageDrawable(Drawable drawable) {
if (mDrawable != drawable) {
...
updateDrawable(drawable);
...
}
}
private void updateDrawable(Drawable d) {
if (mDrawable != null) {
mDrawable.setCallback(null);
unscheduleDrawable(mDrawable);
}
mDrawable = d;
if (d != null) {
d.setCallback(this);
if (d.isStateful()) {
d.setState(getDrawableState());
}
d.setLevel(mLevel);
d.setLayoutDirection(getL