IM 应用中必不可少的就是表情键盘,最近研究了一下,发现表情键盘还是蛮容易做的。

布局

布局文件主要有两个文件了,一个是要放在聊天对话框里的 ViewPager,一个是给 ViewPager 添加的 View。

很明显 ViewPager 是放在聊天布局的最底部,并且 visibility="gone",当点击表情按钮的时候使 visibility="visible"。这个布局里我是把高度给写死了,因为如果不写死的话,在代码中好像布局会出现问题?在网上也看到大多数的人都是给写死的,当然也可以用 onGlobalLayout 的监听去动态配置尺寸。

第 2 个布局就是 ViewPager 中的 View,这里我使用 GridView,并设置 column=7。

配置 ViewPager 中的 View

搞好布局接下来就是 ViewPager 中的 View 了。毫无疑问,一个是 ViewPagerAdapter,一个是 GridViewAdapter,大体思路就是:计算表情包中的表情需要几个 page,分好之后对 GridView 实例进行加载数据,然后把一个一个 gridview 加载到 ViewPager 中去。

首先看看计算表情各种属性的代码,我放在 EmotionHelper 类中:

int pages=emojiCodes.length/ONE_PAGE_SIZE+(emojiCodes.length%ONE_PAGE_SIZE==0? 0:1);

for(int i=0;i

List onePageEmojis = new ArrayList<>();

int start=i*ONE_PAGE_SIZE;

int end=start+Math.min(ONE_PAGE_SIZE,emojiCodes.length-start);

for(int j=start;j

onePageEmojis.add(emojiCodes[j]);

}

emogroups.add(onePageEmojis);

}

emojiCodes 是表情相对应的字符串,page 是得到表情的页数,emogroups 是多个 page 的数组列表。这里已经完成了表情框各个数据的初始化了,接下来就是在 adapter 中利用字符串查找到对应的表情图片,完成加载。

ImageView 在 TextView 中的显示问题

最开始这个还想了我好一会,要在 TextView 中显示 ImageView 该怎么做?后来还上网找到了一个 Spannable 的东西,看英文解释就是可以把类似于 ImageView 的东西 attach 到 TextView 上吧。看代码如何生成可以显示 ImageView 的 SpannableString 吧:

public static CharSequence replace(Context context, String text) {

if (TextUtils.isEmpty(text)) {

return text;

}

SpannableString spannableString = new SpannableString(text);

Matcher matcher = pattern.matcher(text);

while (matcher.find()) {

String factText = matcher.group();

String key = factText.substring(1, factText.length() - 1);

if (contain(emojiCodes, factText)) {

Bitmap bitmap = getDrawableBitmap(context, key);

ImageSpan image = new ImageSpan(context, bitmap);

int start = matcher.start();

int end = matcher.end();

spannableString.setSpan(image, start, end,

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

}

}

return spannableString;

}

这里还了解了一下Pattern和matcher的知识,例如我这里的表情格式是这样的:":clap:",对应的pattern就是

`pattern = Pattern.compile("\\:[a-z]*\\:");`

pattern.matcher就是基于text,利用这个pattern去寻找匹配字符串,faceText就是得到的表情对应的字符串值,之后将对应的bitmap初始化为ImageSpan放入spannableString中去。

表情键盘做好之后,和软键盘的冲突没有很好的协调,下次有机会再好好研究吧。

android 调出键盘表情_Android-表情键盘的制作相关推荐

  1. android 调出键盘表情_Android 软键盘和emoji表情切换方案,和微信几乎一样的体验...

    注意:本项目还有一个小坑.第一次进去的时候有时候输入框没有得到焦点,没有弹出软键盘,所以不能更好的量取软键盘高度,给了一个默认值787 软键盘默认高度.所以可以忽略不计,一旦弹出了软键盘,这个高度就被 ...

  2. edittext 软键盘上方_Android 软键盘的全面解析,让你不再怕控件被遮盖

    原标题:Android 软键盘的全面解析,让你不再怕控件被遮盖 作者 | Vander丶 编辑 | 苏宓 微信公众号 | mobilehub 背景 Android软键盘这块从我入职到现在,是一个一直纠 ...

  3. android 调出键盘表情_android 表情,软键盘冲突解决方案(仿微博等SNS应用)

    之前总想搞一下这个模块,可是由于忙碌总是推迟,现在就把这块好好的弥补过来,下面是我实现的思路.本人才疏学浅,还望大家不要见笑. 首先我们还是先看写示例: 上面应用应该不用我过多介绍,下面我简单介绍下我 ...

  4. android 分区修改工具_Android刷机包制作工具与教程-大神必备

    第一期---技术资料工具(大神必备版): 更新日志: 1.书籍-Android系统级深入开发--移植与调试 2.开发工具-Android-Kitchen 3.boot解包打包修改工具 4.adb-fa ...

  5. android 调出键盘表情_Android高仿微信表情输入与键盘输入详解

    使用到表情与键盘的切换输入,需要多表情的只需要实现自己的表情fragment界面,然后根据工厂类获取即可,上图看效果: 效果还不错吧,哈哈.下面开始介绍: 本篇主要分析的核心类EmotionKeybo ...

  6. android 调出键盘表情_android高仿微信表情输入与键盘输入代码(详细实现分析)

    表情与键盘的切换输入大部分IM都会需要到,之前自己实现了一个,还是存在些缺陷,比如说键盘与表情切换时出现跳闪问题,这个困扰了我些时间,不过所幸在Github(其代码整体结构很不错)并且在论坛上找些解决 ...

  7. android高仿微信表情输入与键盘输入详解-解决跳闪与表情切换问题

    最近公司在项目上要使用到表情与键盘的切换输入,自己实现了一个,还是存在些缺陷,比如说键盘与表情切换时出现跳闪问题,这个相当困扰我,不过所幸在Github(其中一个不错的开源项目是https://git ...

  8. android高仿微信表情输入与键盘输入详解

    转载请注明出处: http://blog.csdn.net/javazejian/article/details/52126391   最近公司在项目上要使用到表情与键盘的切换输入,自己实现了一个,还 ...

  9. android高仿微信表情输入与键盘输入(详细实现分析)

    转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/52126391 出自[zejian的博客]   表情与键盘的切 ...

  10. (转)Android高仿微信表情输入与键盘输入(详细实现分析)

    原地址:http://blog.csdn.net/javazejian/article/details/52126391 转载请注明出处(请尊重原创!谢谢~):  http://blog.csdn.n ...

最新文章

  1. redux 入门到实践
  2. 正则提取字符串-python
  3. Oracle asm aix盘,AIX/HP UX/LINUX上ORACLE ASM添加磁盘
  4. import java.util_importjava.util.*;classKeyMaster{publi..._考试资料网
  5. Q1 SpringBoot启动类如何作为配置类注册进Spring容器的?(ok)
  6. Futter基础第2篇: 实现文本、容器【Text、Container】
  7. C#WinForm开发在选项卡tab中集成加载多个窗体,通过选项卡切换窗体(超详细讲解)
  8. Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx
  9. JVM内存模型(通俗易懂)
  10. ttl备份机顶盒固件_电信盒子华丽变身全网通盒子,电视免费看,备份固件方法详解...
  11. Maven系列(一) — Nexus 下载及配置
  12. C# 注册dll的两种方式
  13. get和post区别
  14. nginx配置https后报错nginx: [emerg] https protocol requires SSL support in XXX.conf详细解决方法
  15. Aligning Domain-Specific Distribution and Classifier for Cross-Domain Classification from Multiple
  16. 如何使用 IFTTT 零成本建立网站内容监控系统?
  17. ORB_SLAM2系列之三:ORB_SLAM2跑RGBD SLAM数据集
  18. 完美解决cannot import name ‘_validate_lengths‘ from ‘numpy.lib.arraypad‘错误
  19. 人工智能在重要研究中,主要有哪些突出应用?
  20. 图的一些基本知识:图,邻居,度矩阵,邻接矩阵

热门文章

  1. 体育会项目查询程序C语言,中考资讯:各地区2021年中考体育会取消吗
  2. 【CNN】——涨点模块SE,CBAM,CA对比
  3. 无人机视觉检测算法研究及数据集汇总
  4. 小红帽 oracle,Linux+5+红帽子企业版安装Oracle9
  5. leetcode 1175. Prime Arrangements(python)
  6. android格式化SD卡,获取其它程序的缓存大小,清理数据
  7. 2021年C/C++Linux服务器开发/后台架构师知识体系整理(持续更新中)
  8. You are the reason I am
  9. powereshell判断目录如果存在pdf文件则打包文件发送到指定邮箱
  10. Ubuntu18.04系统下装CUDA9.0