Android 官方兼容库 EmojiCompat Support Library

#什么是 emoji? emoji 是一种 表情符号,来自日语词汇“絵文字”(假名为“えもじ”,读音即 emoji)android

它的创造者是日本人栗田穰崇 ( Shigetaka Kurita ) ,他将目光投向儿时的各类元素以获取灵感,如日本漫画和日本汉字等。“日本漫画中有许多不一样的符号。漫画家会画出一些表情,表现一我的满头大汗或是迸发出一个想法时头上出现一个灯泡。”同时,从日本汉字中他得到了一种能力,用简单的字符来表达“秘密”和“爱”等抽象概念。git

image.png

早期的 emoji 表情并无一套统一的规范,日本的三大电信运营商,NTT DoCoMo,au/KDDI,Softbank 都各自有一套关于 Emoji 的编码规范,致使运营商用户之间发送 emoji 表情时没法显示。github

直到2010年10月,随着 Unicode6.0 的发布,Emoji 的编码以及对应的表情图片正式被规范化,核心 Emoji 表情包含722个 Emoji 编码。缓存

以后 2014年6月15日发布的 Unicode 7.0 规范以及 2016年6月22日发布的 Unicode 9 规范都不断地加入新的 emoji 表情,目前整个 emoji 表情已经达到了一千多个。bash

感兴趣的同窗能够到这里查看全部表情对应的编码app

emoji 表情列表maven


#Android 对 emoji 表情的兼容ide

不少同窗可能并无注意到 Android 设备上的 Emoji 表情性能

通常状况下,咱们在手机上进行操做时, 只有使用了输入法自带的表情及 emoji 表情才会在文本中产生 emoji 编码。字体

image.png

image.png

在 Android 4.4 以前, Android 并不支持 emoji 表情,当时的解决方案主要是经过 imageSpan 配合 spannableString,来替换掉文字中的 emoji unicode 编码符号。

从 Android 4.4 开始, 官方开始了 emoji 表情的支持,实现原理基本就是经过把 emoji 表情内置在系统的 ttf 字体库中,对文本进行过滤后显示出 emoji 表情。

因为不一样 Android 版本内置的 ttf 字体库对 emoji 表情的版本支持程度不一样,致使老版本的 Android 对最新的 emoji 表情支持不全,因此一些 在新的 unicode 版本规范中被加入的 emoji 表情在老的 Android 设备上会显示方框乱码。

为了处理这个问题,除去上文提到的 spannable 的处理方案,咱们还能够经过定义本身的 ttf 字体库给文本空间指定字体来显示 emoji 表情。


#EmojiCompat Support Library 的诞生

正是因为上文提到的兼容问题,Google 官方的 EmojiCompat Support Library 诞生了。

目前这个库能向下兼容到 Android 4.4,其主要目标就是为了让咱们的 Android 设备可以支持最新的 emoji 表情,防止最新的 emoji 表情在咱们的手机上显示为☐。

Emoji 对照

EmojiCompat 经过 CharSequence 文本中的 emoji 对应的 unicode 编码来识别 emoji 表情,将他们替换成 EmojiSpans ,最后再将 EmojiSpan 渲染成对应的 emoji 表情符号。

emojiCompat处理过程

对于 EmojiCompat 的使用,有两种配置方式:

Downloadable fonts configuration

Downloadable fonts 是 Android O 新增的一个功能,支持经过 google mobile service 远程拉取须要的字体库到本地来进行使用。

因为国内屏蔽了 Google Service ,因此这种方式在国内咱们使用不了,这里咱们就不作详细介绍了。

Bundled fonts configuration

Bundled fonts 即打包字体,就是使用本地打包好的 emoji 字体库来兼容 emoji 表情。

目前官方使用的是 NotoColorEmojiCompat.ttf 字体文件。


#EmojiCompat 的使用 接下来咱们来看看如何使用 emojiCompat 库

###添加依赖库

首先咱们在 build.gradle 中配置咱们的依赖包,因为咱们使用的是 Bundled fonts 的配置,因此咱们须要先引入咱们的 emoji bundle 库:

dependencies {
    ...
    compile "com.android.support:support-emoji-bundled:$version"
}
复制代码

这里我 $version 设置的版本是 26.0.0-beta1,若是编译过程当中提示找不到依赖库,须要在 repositories 仓库配置中加入 Google 的 maven 地址:

allprojects {
    repositories {
        jcenter()
        maven { url 'https://maven.google.com' }
    }
}
复制代码

接着咱们引入 EmojiCompat 的组件库:

dependencies {
    ...
    compile "com.android.support:support-emoji:26.0.0-beta1"
}
复制代码

该组件库对应的 emojiCompat 组件:

<android.support.text.emoji.widget.EmojiTextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

<android.support.text.emoji.widget.EmojiEditText
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

<android.support.text.emoji.widget.EmojiButton
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>
复制代码

若是你使用的是 AppCompat 库, 也能够直接添加 emojiCompat 的 compat 组件库

dependencies {
      compile "com.android.support:support-emoji-appcompat:26.0.0-beta1"
}
复制代码

该引用库对应的组件:

<android.support.text.emoji.widget.EmojiAppCompatTextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

<android.support.text.emoji.widget.EmojiAppCompatEditText
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

<android.support.text.emoji.widget.EmojiAppCompatButton
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>
复制代码

compat 库跟非 compat 库之间的差异主要就是在使用的组件名称上,其余的方式基本一致。

###初始化 EmojiCompat

在正式使用 EmojiCompat 以前咱们还须要对其进行初始化

public class MyApplication extends Application {
@Override
    public void onCreate() {
       super.onCreate();
       EmojiCompat.Config config = new BundledEmojiCompatConfig(this);
       EmojiCompat.init(config);
    }
}
复制代码

此时咱们即可以使用上一步添加的 emojiCompat 组件来替换原有的 TextView、 EditText 以及 Button 组件了,当文本中遇到对应的 emoji 表情编码时就会自动替换为 emoji 表情了。

device-2017-06-30-134851.png

###不经过组件使用 emojiCompat 兼容库

EmojiCompat 库经过 EmojiSpan 来渲染正确的表情图片,所以须要先将文本 CharSequence 根据 emoji 编码转换成对应的 EmojiSpan Spanned 实例。

EmojiCompat 专门提供了一个 process() 方法用于CHarSequence 实例的转换

使用这种方法,咱们能够缓存处理过的实例而不是原始字符串,在须要使用的地方直接调用该实例,从而提升应用程序的性能。

TextView regularTextView = findViewById(R.id.regular_text_view);

CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");

regularTextView.setText(processed);
复制代码

###自定义 EmojiCompat 组件 除了上面提到的经过 EmojiCompat 的 process 方法转换 spanned 实例外,咱们还能够经过官方提供的两个 widget helper 类来自定义咱们的 TextView 以及 EditTextView 组件:

android.support.text.emoji.widget.EmojiTextViewHelper android.support.text.emoji.widget.EmojiEditTextHelper

示例代码:

自定义Emoji TextView

public class MyTextView extends AppCompatTextView {
   ...
   public MyTextView(Context context) {
       super(context);
       init();
   }
   ...
   private void init() {
       getEmojiTextViewHelper().updateTransformationMethod();
   }

   @Override
   public void setFilters(InputFilter[] filters) {
       super.setFilters(getEmojiTextViewHelper().getFilters(filters));
   }

   @Override
   public void setAllCaps(boolean allCaps) {
       super.setAllCaps(allCaps);
       getEmojiTextViewHelper().setAllCaps(allCaps);
   }

   private EmojiTextViewHelper getEmojiTextViewHelper() {
       ...
   }
}
复制代码

自定义 Emoji EditText

public class MyEditText extends AppCompatEditText {
   ...
   public MyEditText(Context context) {
       super(context);
       init();
   }
   ...
   private void init() {
       super.setKeyListener(getEmojiEditTextHelper().getKeyListener(getKeyListener()));
   }

   @Override
   public void setKeyListener(android.text.method.KeyListener keyListener) {
       super.setKeyListener(getEmojiEditTextHelper().getKeyListener(keyListener));
   }

   @Override
   public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
       InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
       return getEmojiEditTextHelper().onCreateInputConnection(inputConnection, outAttrs);
   }

   private EmojiEditTextHelper getEmojiEditTextHelper() {
       ...
   }
}
复制代码

#总结 看了上面的使用步骤,EmojiCompat 的使用是否是很方便呢?

目前来讲,EmojiCompat 只兼容 Android 4.4 以上的设备,对于 4.4 如下的设备,它的行为跟普通的 Android 组件没有差别。

EmojiCompat 的初始化时间大约只须要 150 毫秒,内存的占用大概在200kb,因此你能够放心大胆地去使用它。

这里是官方的 Demo 地址: github.com/googlesampl…

里面包含了 downloadable fonts 的使用,由于比较完善 ,因此就不放我本身的 Demo 啦,感兴趣的小伙伴赶忙去下载看看吧!

相关文章
相关标签/搜索