公司的任务要求实现类似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