android平台TextView使用ImageSpan展示GIF图片

本文介绍了如何借助android-gif-drawable库在Android的TextView和EditText中实现GIF动态图的展示,详细讲解了设置过程。
摘要由CSDN通过智能技术生成
 

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
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值