



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
我们在进行qq聊天的时候发送表情,但这些表情都是并不是静态的,更多的是动态图,gif图,那么如何在android客户端显示动态gif图呢。在github上找到了这样一种方法Github地址/TracyZhangLei/android-gif-demo由于我是截图,所以看不到动态效果,大家可以自己下载看一下。我们首先来看一下该开源项目的代码。该开源项目主要是通过自定义一个Adapter-chatAdapter,在ChatAdapter每一条的setText属性中使用了自定义的方法convertNormalStringToSpannableStringconvertNormalStringToSpannableString方法的返回值是SpannableString我们首先来了解一下什么是SpannableStringTextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式、事件方面的设置。Android系统通过SpannableString类来对指定文本进行相关处理,也就是说我们想要实现文字加动态表情的实现就要通过SpannableString这个类来实现。private SpannableString convertNormalStringToSpannableString(String message , final TextView tv) SpannableString value = SpannableString.valueOf(message);Matcher localMatcher = EMOTION_URL.matcher(value);while (localMatcher.find() String str2 = localMatcher.group(0);int k = localMatcher.start();int m = localMatcher.end();if (m - k 8) int face = fm.getFaceId(str2);if(-1!=face)/wrapping with weakReferenceWeakReference localImageSpanRef = new WeakReference(new AnimatedImageSpan(new AnimatedGifDrawable(cxt.getResources().openRawResource(face), new AnimatedGifDrawable.UpdateListener() Override public void update() /update the textview tv.postInvalidate(); );value.setSpan(localImageSpanRef.get(), k, m, Spanned.SPAN_INCLUSIVE_INCLUSIVE);return value;首先将我们传入的message转化成SpannableString类,然后看一下传入的值是否符合我们一开始写好的正则表达式EMOTION_URLprivate Pattern EMOTION_URL = Ppile(S+?);如果符合的话 我们取group(0)附:group是针对()来说的,group(0)就是指的整个串,group(1) 指的是第一个括号里的东西,group(2)指的第二个括号里的东西。子表达式和起始位置和结束位置的差小于8,也就是符合我们的要求。调用FaceManager中的getFaceId方法public int getFaceId(String faceStr)if(mFaceMap.containsKey(faceStr)return mFaceMap.get(faceStr);return -1;找到我们用Map进行存储的表情如果表情存在的话利用一个弱引用(WeakReference)把自定义的AnimatedImageSpan进行处理,使AnimatedImageSpan不那么的消耗内存,在UpdateListener中利用postInvalidate刷新界面。最后把SpannableString的setSpan方法,三个参数分别是要放进去的span ,起始位置,结束位置,flag标志。关于flag:Spanned.SPAN_EXCLUSIVE_EXCLUSIVE, 这是在 setSpan 时需要指定的 flag,它是用来标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果。分别有 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、 Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、 Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、 Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)。最后将SpannableString返回,实现动态图文混排。关于自定义的AnimatedImageSpan如下:public class AnimatedImageSpan extends DynamicDrawableSpan private Drawable mDrawable; public AnimatedImageSpan(Drawable d) super(); mDrawable = d; / Use handler for ticks to proceed to next frame final Handler mHandler = new Handler(); mHandler.post(new Runnable() public void run() (AnimatedGifDrawable)mDrawable).nextFrame(); / Set next with a delay depending on the duration for this frame mHandler.postDelayed(this, (AnimatedGifDrawable)mDrawable).getFrameDuration(); ); Override public Drawable getDrawable() return (AnimatedGifDrawable)mDrawable).getDrawable(); Override public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) Drawable d = getDrawable(); Rect rect = d.getBounds(); if (fm != null) fm.ascent = -rect.bottom; fm.descent = 0; fm.top = fm.ascent; fm.bottom = 0; return rect.right; Override public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) Drawable b = getDrawable(); canvas.save(); int transY = bottom - b.getBounds().bottom; if (mVe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年春季中国石油高校毕业生招聘(河南有岗)模拟试卷附答案详解(模拟题)
- 唐山市人民医院肛肠科主治医师晋升考核
- 2025广西桂林医科大学第一附属医院招聘普通合同工4人考前自测高频考点模拟试题完整参考答案详解
- 2025儿童医院麻醉药品管理考核
- 2025湖北荆州区校园招聘中小学教师49人考前自测高频考点模拟试题及答案详解1套
- 张家口市中医院神经科健康教育能力考核
- 重庆市人民医院内脏动脉瘤腔内治疗技术考核
- 2025江西省财通供应链金融集团有限公司劳务派遣制人员招聘8人考前自测高频考点模拟试题及答案详解(考点梳理)
- 张家口市中医院酶联免疫技术专项考核
- 2025广东清远市清城区招聘事业单位人才专项编制人员11人考前自测高频考点模拟试题附答案详解
- 练习使用显微镜 全国公开课一等奖
- 2023年高考地理(上海卷)-含答案
- 比重式精选机的使用与维护
- GB/T 39554.1-2020全国一体化政务服务平台政务服务事项基本目录及实施清单第1部分:编码要求
- GB/T 2942-2009硫化橡胶与纤维帘线静态粘合强度的测定H抽出法
- 电梯设计系统
- 细胞培养技术培训课件
- 劳动保障协理员考试复习资料
- DB3301T 0286-2019 城市绿地养护管理质量标准
- 轴类零件工艺工序卡片
- 道德与法治-六年级(上册)-《知法守法 依法维权》教学课件
评论
0/150
提交评论