发布网友 发布时间:2023-01-20 04:50
共1个回答
热心网友 时间:2023-12-18 19:52
在im项目(Android)中,用户发消息,喜欢在文字中嵌入一些小表情,以表达发送者当时的情感。除了系统输入法自带的emoji表情(emoji其实是特殊的文字)外。项目希望带一些更漂亮,带产品特色文化的自定义小表情(小图片)。
图片嵌入在文字中显示,很明显可以使用ImageSpan去实现该效果。
效果如图:
实现上,主要问题是,实现文字与表情的转换。因此需要定义一套对应关系。
这里采用类似微信的实现,[key]对应表情。比如: [微笑] 对应 😊。
工具类:
主要就是做一个转换功能。同时需要考虑一下性能优化,否则效率低就会卡顿。
PS:这里优化了 查询转换策略 和 Drawable复用策略,供参考。
注:Spannable有关的操作,少用String。使用CharSequence,因为不一定是String。用 SpannableString.valueOf(text) 代替 new SpannableString(text)
在TextView上使用,也写个BindingAdapter方法。
注:其中 TextUtils.ellipsize(emo, paint, avail, TextUtils.TruncateAt.END) 是为了解决表情在单行textView显示不下时显“...”.的问题。直接默认用TextView的 ellipsize 属性,对表情(ImageSpan)无效,会截成半个。
表情要在输入框中显示。根据输入code,自动转换成表情(ImageSpan)。
方案1:给EditView设置监听,在文字变化后将文字做个转换。这样效率超低,输入越多越卡。否决!
方案2:根据具体变化的文本设置转换。
注:当前输入的东西(可能是复制过来的多个字符)。可能会影响到前面或后面的几个字符。
表情选择框操作:
删除:模拟退格,表情需要整个整个删。
插入:将code插入到光标末尾。
转发到微信,有些表情微信里没有对应。转换成emoji代替。
要点: