我在视图中使用表情符号unicode。在大多数设备上,图像显示正常,但在我的一个低端设备(android 2.3)上,它们呈现为小方块。
我可以检查设备是否支持表情符号吗?这样我就可以发布我的apk而不会在某些设备上显示丑陋的方块。
答案 0 :(得分:3)
这是一个迟到的答案,但我最近遇到了类似的问题。我需要过滤List<String>
并过滤掉无法在设备上呈现的表情符号(即,如果设备已旧并且不支持渲染它们)。
我最终做的是使用Paint
来衡量文字宽度。
Paint mPaint = new Paint();
private boolean emojiRenderable(String emoji) {
float width = mPaint.measureText(emoji);
if (width > 7) return true;
return false;
}
width > 7
部分特别hacky,我希望不可渲染表情符号的值为0.0
,但在一些设备中,我发现该值实际上在{{1}左右} 3.0
表示不可渲染,6.0
表示12.0
表示可渲染。您的结果可能会有所不同,因此您可能需要测试一下。我相信字体大小也会对15.0
的输出产生影响,所以请记住这一点。
总的来说,我不确定这是否是一个很好的解决方案,但它是迄今为止我提出的最好的解决方案。
答案 1 :(得分:1)
请检查Googles Mozc项目的源代码。 EmojiRenderableChecker类似乎运行得很好! https://github.com/google/mozc/blob/master/src/android/src/com/google/android/inputmethod/japanese/emoji/EmojiRenderableChecker.java
它就像Paint.hasGlypgh的一个compat版本(在Marshmallow中添加)。 https://developer.android.com/reference/android/graphics/Paint.html#hasGlyph(java.lang.String)
答案 2 :(得分:0)
从以上文件中找到的两种方法启发。
public static boolean canShowEmoji(String emoji) {
Paint paint = new Paint();
float tofuWidth = paint.measureText("\uFFFE");
float standardWidth = paint.measureText("\uD83D\uDC27");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return paint.hasGlyph(emoji);
} else {
float emojiWidth = paint.measureText(emoji);
return emojiWidth > tofuWidth && emojiWidth < standardWidth * 1.25;
// This assumes that a valid glyph for the cheese wedge must be greater than the width
// of the noncharacter.
}
}