如题,这是公司项目的一个功能模块,先上个效果图:
其次大致说说原理:
1,首先判断输入的字符,是否包含表情的文字,比如 这个表情对应的文件名为 emoji_1.png,它对应的文字描述 : [可爱],如果我们在输出的是输出这么一句话:老婆,我想你了
。 那么我们对应的根本文字就是:老婆,我想你了[可爱]。
2,具体的转换过程就是用正则表达式比配文字中是否含有[xxx]这类的文字,如果有,那么我们就根据拿到的[xxx]找到它对应的资源文件id,当然这其中有一个关系表,看你怎么处理这个关系了。最后将其用SpannableString替换成文字,表面上显示有图片,其实TextView里的text依然是:老婆,我想你了[可爱]。这个过程明白么?
下面贴上DEMO工程的结构:
再贴上几个重要的类:
- package com.example.facedemo;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.text.Spannable;
- import android.text.SpannableString;
- import android.text.TextUtils;
- import android.text.style.ImageSpan;
- import android.util.Log;
- /**
- *
- ******************************************
- * @author 廖乃波
- * @文件名称 : FaceConversionUtil.java
- * @创建时间 : 2013-1-27 下午02:34:09
- * @文件描述 : 表情轉換工具
- ******************************************
- */
- public class FaceConversionUtil {
- /** 每一页表情的个数 */
- private int pageSize = 20;
- private static FaceConversionUtil mFaceConversionUtil;
- /** 保存于内存中的表情HashMap */
- private HashMap emojiMap = new HashMap();
- /** 保存于内存中的表情集合 */
- private List emojis = new ArrayList();
- /** 表情分页的结果集合 */
- public List emojiLists = new ArrayList();
- private FaceConversionUtil() {
- }
- public static FaceConversionUtil getInstace() {
- if (mFaceConversionUtil == null) {
- mFaceConversionUtil = new FaceConversionUtil();
- }
- return mFaceConversionUtil;
- }
- /**
- * 得到一个SpanableString对象,通过传入的字符串,并进行正则判断
- *
- * @param context
- * @param str
- * @return
- */
- public SpannableString getExpressionString(Context context, String str) {
- SpannableString spannableString = new SpannableString(str);
- // 正则表达式比配字符串里是否含有表情,如: 我好[开心]啊
- String zhengze = "\\[[^\\]]+\\]";
- // 通过传入的正则表达式来生成一个pattern
- Pattern sinaPatten = Pattern.compile(zhengze, Pattern.CASE_INSENSITIVE);
- try {
- dealExpression(context, spannableString, sinaPatten, 0);
- } catch (Exception e) {
- Log.e("dealExpression", e.getMessage());
- }
- return spannableString;
- }
- /**
- * 添加表情
- *
- * @param context
- * @param imgId
- * @param spannableString
- * @return
- */
- public SpannableString addFace(Context context, int imgId,
- String spannableString) {
- if (TextUtils.isEmpty(spannableString)) {
- return null;
- }
- Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
- imgId);
- bitmap = Bitmap.createScaledBitmap(bitmap, 35, 35, true);
- ImageSpan imageSpan = new ImageSpan(context, bitmap);
- SpannableString spannable = new SpannableString(spannableString);
- spannable.setSpan(imageSpan, 0, spannableString.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- return spannable;
- }
- /**
- * 对spanableString进行正则判断,如果符合要求,则以表情图片代替
- *
- * @param context
- * @param spannableString
- * @param patten
- * @param start
- * @throws Exception
- */
- private void dealExpression(Context context,
- SpannableString spannableString, Pattern patten, int start)
- throws Exception {
- Matcher matcher = patten.matcher(spannableString);
- while (matcher.find()) {
- String key = matcher.group();
- // 返回第一个字符的索引的文本匹配整个正则表达式,ture 则继续递归
- if (matcher.start()
关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录