【Interface&navigation】表情符号兼容性(28)

该EmojiCompat支持库的目标是让Android设备达到使用最新的表情符号。它可以防止您的应用以☐的形式显示缺少的表情符号字符,表示您的设备没有显示文本的字体。通过使用EmojiCompat支持库,您的应用用户无需等待Android操作系统更新即可获取最新的表情符号。
【Interface&navigation】表情符号兼容性(28)
图1.表情符号比较

请参阅以下相关资源:
表情符号兼容性示例应用程序

EmojiCompat如何运作?


所述EmojiCompat支撑库提供类来实现上运行Android 4.4(API级19)和较高的器件的向后兼容的表情符号的支持。您可以EmojiCompat使用捆绑或可下载字体进行配置 。有关配置的更多信息,请参阅以下部分:

可下载的字体配置
捆绑字体配置
EmojiCompat识别给定的表情符号 ,如果需要CharSequence,用它们替换它们 EmojiSpans,最后渲染表情符号字形。图2演示了该过程。
【Interface&navigation】表情符号兼容性(28)
图2. EmojiCompat过程

可下载的字体配置


可下载字体配置使用可下载字体支持库功能下载表情符号字体。它还会更新EmojiCompat 支持库需要跟上Unicode规范的最新版本所需的表情符号元数据。

添加支持库依赖项
要使用EmojiCompat支持库,必须在开发环境中修改应用程序项目的类路径依赖项。

要向应用程序项目添加支持库:

打开build.gradle应用程序的文件。
将支持库添加到该dependencies部分。

dependencies {
    ...
    compile "com.android.support:support-emoji:27.1.1"
}

初始化可下载的字体配置

您需要初始化EmojiCompat以加载元数据和字体。由于初始化可能需要一些时间,因此初始化过程在后台线程上运行。

要EmojiCompat使用可下载的字体配置进行初始化,请执行以下步骤:

扫描二维码关注公众号,回复: 2264182 查看本文章

创建FontRequest 类的实例,并提供字体提供程序权限,字体提供程序包,字体查询以及证书的哈希集列表。有关详细信息FontRequest,请参阅可 下载字体 文档 中的“以编程方式使用可下载字体”部分。
创建的实例 FontRequestEmojiCompatConfig ,并提供实例Context和 FontRequest。
EmojiCompat通过调用 init() 方法初始化并传递实例 FontRequestEmojiCompatConfig。

public class MyActivity extends Activity {
    @Override
    public void onCreate() {
        super.onCreate();
        FontRequest fontRequest = new FontRequest(
               "com.example.fontprovider",
               "com.example",
               "emoji compat Font Query", CERTIFICATES);
        EmojiCompat.Config config = new FontRequestEmojiCompatConfig(this, fontRequest);
        EmojiCompat.init(config);
        ...
    }
}

EmojiCompat在布局XML中使用小部件。如果您正在使用AppCompat,请参阅 使用带有AppCompat的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"/>

有关如何EmojiCompat使用可下载字体配置进行配置的详细信息 ,请转到 表情符号兼容性示例应用程序。

库组件


【Interface&navigation】表情符号兼容性(28)
图3. EmojiCompat过程中的库组件

小工具:EmojiEditText, EmojiTextView, EmojiButton
默认控件的实现使用 EmojiCompat同 TextView,EditText和 Button。
EmojiCompat
支持库的主要公共表面。它执行所有外部调用并与系统的其他部分进行协调。
EmojiCompat.Config
配置要创建的单例实例。
EmojiSpan
甲ReplacementSpan亚类,它取代了字符(序列)并呈现字形。
EmojiCompat 字形
EmojiCompat使用字体显示表情符号。此字体是Android Emoji字体的修改版本 。字体修改如下:
为了向渲染表情符号提供向后兼容性,所有表情符号字符在Unicode的补充专用区域A中用单个Unicode代码点表示,以U + F0001开头。
额外的表情符号元数据以二进制格式插入到字体中,并在运行时解析 EmojiCompat。数据嵌入在字体meta表中,带有私有标签 Emji。

配置选项


您可以使用EmojiCompat实例来修改EmojiCompat行为。您可以使用基类中的以下方法来设置配置:

setReplaceAll():确定是否EmojiCompat应该替换它找到的所有表情符号 EmojiSpans。默认情况下, EmojiCompat尽力了解系统是否可以渲染表情符号并且不替换这些表情符号。设置为时true, EmojiCompat替换它找到的所有表情符号EmojiSpans。
setEmojiSpanIndicatorEnabled():表示是否EmojiCompat用表示 替换了表情符号 EmojiSpan。设置为时true, EmojiCompat绘制背景 EmojiSpan。此方法主要用于调试目的。
setEmojiSpanIndicatorColor():设置颜色以指示EmojiSpan。默认值为GREEN。
registerInitCallback:通知应用程序有关EmojiCompat初始化的状态 。

EmojiCompat.Config config = new FontRequestEmojiCompatConfig(...)
       .setReplaceAll(true)
       .setEmojiSpanIndicatorEnabled(true)
       .setEmojiSpanIndicatorColor(Color.GREEN)
       .registerInitCallback(new InitCallback() {...})

添加初始化侦听器


EmojiCompat和 EmojiCompat类提供 registerInitCallback() 和 unregisterInitCallback() 注册初始化回调的方法。要使用这些方法,请创建EmojiCompat.InitCallback该类的实例 。调用这些方法并传递EmojiCompat.InitCallback类的实例 。当EmojiCompat支持库的初始化成功时,EmojiCompat 该类将调用该 onInitialized() 方法。如果库无法初始化,则EmojiCompat 该类将调用该 onFailed() 方法。

要在任何时候检查初始化状态,请调用该 getLoadState() 方法。它返回下列值之一: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED或LOAD_STATE_FAILED。

将EmojiCompat与AppCompat小部件一起使用


如果您正在使用AppCompat widgets,则可以使用EmojiCompat从中扩展的小部件AppCompat widgets。

将支持库添加到依赖项部分。

dependencies {
      compile "com.android.support:support-emoji-appcompat:$version"
}

EmojiCompat AppCompat Widget在布局XML中使用小部件。

<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"/>

捆绑字体配置


该EmojiCompat支持库中也有捆绑的字体版本。此程序包包含带有嵌入元数据的字体。该包装还包括一个 BundledEmojiCompatConfig 使用该AssetManager加载的元数据和字体。
注意:字体的大小是几兆字节

添加支持库依赖项

要使用EmojiCompat带有捆绑字体配置的支持库,必须在开发环境中修改应用程序项目的类路径依赖项。

要向应用程序项目添加支持库:

打开build.gradle应用程序的文件。
将支持库添加到该dependencies部分。

dependencies {
    ...
    compile "com.android.support:support-emoji-bundled:$version"
}

使用捆绑字体配置EmojiCompat

要使用捆绑字体进行配置 EmojiCompat,请执行以下步骤:

使用BundledEmojiCompatConfig 创建的实例EmojiCompat ,并提供实例Context。
调用 init() 方法初始化 EmojiCompat并传递实例 BundledEmojiCompatConfig。

public class MyActivity extends Activity {
    @Override
    public void onCreate() {
        super.onCreate();
        EmojiCompat.Config config = new BundledEmojiCompatConfig(this);
        EmojiCompat.init(config);
        ...
    }
}

在没有小部件的情况下使用EmojiCompat


EmojiCompat用于 EmojiSpan渲染正确的图像。因此,它必须将任何给定的CharSequence转换为 Spanned实例 EmojiSpans。本 EmojiCompat类提供了转换方法CharSequences为 Spanned实例用 EmojiSpans。使用此方法,您可以处理和缓存已处理的实例而不是原始字符串,从而提高应用程序的性能。

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

使用EmojiCompat进行IME


使用EmojiCompat支持库,键盘可以呈现与其交互的应用程序支持的表情符号。IME可以使用该 hasEmojiGlyph() 方法来检查是否EmojiCompat能够呈现表情符号。如果 可以检测并呈现表情CharSequence符号,此方法将使用表情符号并返回。 trueEmojiCompat

键盘还可以检查EmojiCompat应用程序支持的支持库的版本, 以确定要在调色板中呈现的表情符号。要检查版本(如果可用),键盘需要检查包中是否存在以下键 EditorInfo.extras :

EDITOR_INFO_METAVERSION_KEY
如果密钥存在于捆绑包中,则该值表示应用程序使用的表情符号元数据的版本。如果此密钥不存在,则应用程序未使用EmojiCompat。

EDITOR_INFO_REPLACE_ALL_KEY
如果密钥存在且设置为true,则表示应用程序已调用该 SetReplaceAll() 方法。有关EmojiCompat配置的更多信息 ,请参阅“ 配置选项” 部分。

在接收到EditorInfo.extras捆绑中的密钥后 ,键盘可以使用该 hasEmojiGlyph() 方法metadataVersion的值 EDITOR_INFO_METAVERSION_KEY来检查应用程序是否可以呈现特定的表情符号。

将EmojiCompat与自定义小部件一起使用


您始终可以使用该process() 方法对CharSequence应用程序中的预处理进行处理,并将其添加到可以呈现Spanned实例的任何窗口小部件中; 例如,TextView。此外, EmojiCompat还提供了以下窗口小部件帮助程序类,使您可以轻松地使用表情符号支持来丰富自定义窗口小部件。

EmojiTextViewHelper
EmojiEditTextHelper
示例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() {
       ...
   }
}

示例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() {
       ...
   }
}

经常问的问题


如何启动字体下载?
表情符号字体是在第一次请求时下载的,如果设备上不存在的话。下载计划对应用程序是透明的。

初始化需要多长时间?
下载字体后,初始化大约需要150毫秒EmojiCompat。

EmojiCompat支持库使用多少内存?
目前,查找表情符号的数据结构已加载到应用程序的内存中,使用大约200KB。

我可以将EmojiCompat用于自定义TextView吗
是。EmojiCompat为自定义小部件提供帮助程序类。也可以预处理给定的字符串并将其转换为 Spanned。有关窗口小部件帮助程序类的更多信息,请参阅 使用自定义窗口小部件的EmojiCompat 部分。

如果我在Android 4.4(API级别19)或更低版本上运行的设备上添加布局XML中的小部件,会发生什么?
您可以在EmojiCompat 支持运行Android 4.4(API级别19)或更低版本的设备的应用程序中包含支持库或其小部件。但是,如果设备在API级别19之前的Android版本上运行, EmojiCompat并且其小部件处于“无操作”状态。这意味着 EmojiTextView行为与常规行为完全相同TextView。 EmojiCompat实例; LOAD_STATE_SUCCEEDED 当你调用init() 方法时它会立即进入一个 状态 。

其他资源


有关使用EmojiCompat 库的其他信息 ,请观看EmojiCompat

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Interface&navigation】表情符号兼容性(28)

猜你喜欢

转载自blog.51cto.com/4789781/2147515