android qq聊天动态表情的实现

本文介绍了如何在Android应用中实现类似QQ聊天的动态表情功能。通过自定义`GifTextView`,结合`GifDecoder`解析GIF图片并控制多个表情的同步播放。关键在于使用一个线程来管理所有`GifTextView`的更新,避免为每个`TextView`开启单独线程,从而优化性能。此外,文章提供了代码示例和线程管理策略。
摘要由CSDN通过智能技术生成

  公司的任务要求实现类似qq聊天动态表情,在网上找了不少资料,基本都是TextView加SpannableString来显示gif,通过自定义一个TextView,启动线程更新图片。由于聊天时可输入多个表情,gif图片各帧时间的不同,就导致了显示多个gif图片很别扭的问题,而且每个TextView就开一个线程也不实际。研究了一下qq聊天,发现所有表情相同的gif图片显示的都是相同的帧。由此我认为qq是通过一个线程来控制所有的TextView更新gif的。

  在这里我使用的GifView的源码来解析gif图片,并修改了其中的GifView,使其继承TextView来达到要求,其他源码不变。源码忘了是在哪下载的,还带有demo,非常感谢好心人。

上代码 GifTextView

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.mcds.app.android.estar.component.MySpan;
import com.mcds.app.android.estar.util.FaceUtility;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ImageSpan;
import android.util.AttributeSet;
import android.widget.TextView;

public class GifTextView extends TextView implements GifAction {

 /** gif解码器 */
 private GifDecoder gifDecoder = null;
 private String input="";//需要显示的文字
 private SpannableString spannable;
 BitmapDrawable drawable;//需要添加的图片资源
 private  long time;//记录post到主线程的时间
 private class Info {//保存input中需要添加的SpannableString的信息
  String decodername;//gif图片名称,根据次名称去bitmapMap去图片
  int start;//开始位置
  int end;//结束位置
 }
 //保存需要更新的GifTextView,简单的检查者模式,退出activity时清空,新建GifTextView时添加到此list中
    public static ArrayList<GifTextView> textViewList = new ArrayList<GifTextView>();
    //保存gifDecoder的信息,使用gif图片的名称作key,只添加,不删除,
 public static HashMap<String, DecoderInfo> decodermap = new HashMap<String, DecoderInfo>();
 //保存更新后drawable的信息,使用gif图片的名称作key,GifTextView更新时,根据key取drawable
 public static HashMap<String, Bitmap> bitmapMap = new HashMap<String, Bitmap>();
 //保存需要添加的SpannableString

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值