Android-表情键盘的制作

本贴最后更新于 3442 天前,其中的信息可能已经事过景迁

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<pages;i++){ List<String> 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<end;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 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    336 引用 • 324 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 1 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖 • 1 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    181 引用 • 408 回帖 • 486 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖 • 2 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 1 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 764 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖 • 1 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 93 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 16 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖 • 1 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    58 引用 • 25 回帖 • 3 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 251 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    24 引用 • 241 回帖
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 9 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1441 引用 • 10069 回帖 • 494 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    89 引用 • 1251 回帖 • 406 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 8 关注
  • 996
    13 引用 • 200 回帖 • 8 关注
  • 叶归
    8 引用 • 36 回帖 • 17 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 61 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖
  • abitmean

    有点意思就行了

    34 关注