android上emoji字体绘制不展示
最近处理安卓 相关文字渲染 emoji 文字,发现android上不显示,官方的demo无论是2.1.0的tag还是main分支都不显示。 我现在基于2.1.0分支的代码,开发的功能 ,在鸿蒙上正常,在android上emoji就不显示,调试发现
`
tgfx::GlyphID glyphID = textTypeface ? textTypeface->getGlyphID(characterUnicode);
auto glyphCodec = fontEmoji->getImage(glyphID, nullptr, nullptr); auto glyphImage = tgfx::Image::MakeFrom(glyphCodec);`
如果是emoji文字的话 glyphID正常,但时候后面的glyphCodec都是null 目前测试俩平台,鸿蒙正常,安卓异常,代码是一套
这个是Android默认emoji字体格式改变的问题,最新的是彩色矢量的emoji格式,这种格式支持起来比较困难,对程序包体挑战也很大。要兼容这种字体短期都会比较难。最简单的处理是程序动态下载一个旧版本的emoji字体(位图格式的)给引擎使用就行。
这个是Android默认emoji字体格式改变的问题,最新的是彩色矢量的emoji格式,这种格式支持起来比较困难,对程序包体挑战也很大。要兼容这种字体短期都会比较难。最简单的处理是程序动态下载一个旧版本的emoji字体(位图格式的)给引擎使用就行。
大佬 这个限制在鸿蒙和ios上有同样的问题么,旧版本的emoji字体有推荐么
这个是Android默认emoji字体格式改变的问题,最新的是彩色矢量的emoji格式,这种格式支持起来比较困难,对程序包体挑战也很大。要兼容这种字体短期都会比较难。最简单的处理是程序动态下载一个旧版本的emoji字体(位图格式的)给引擎使用就行。
大佬 这个限制在鸿蒙和ios上有同样的问题么,旧版本的emoji字体有推荐么
还有我按照pag的方案对手机上内置的字体全量检测 ,用了三部手机 小米14 ,一加 vivo 应该都是你说的类似的问题
鸿蒙应该是基于旧的的Android系统开发的。没有去改这块的系统默认字体格式,不确定他们后续版本会不会跟进。这个只和系统版本有关系。你检测一下Android 15系统版本就行。公告在这里:https://android-developers.googleblog.com/2024/07/the-fourth-beta-of-android-15.html :Removed PNG-based emoji font。
我们仓库里的这个字体就可以:https://github.com/Tencent/tgfx/blob/main/resources/font/NotoColorEmoji.ttf 你也可以自己从Android 14及以下版本的系统里提取对应的NotoColorEmoji
大佬 ios 上有这个问题么,我看他官网提到了FreeType的新版本好像已经支持了新的字体,这个后续有升级适配计划么,我先用备份字体,我看官网上也提供了字体文件和你提到字体文件,大小都是10M,先做下下载适配了
iOS没有这个问题,他们一直是采用位图字体。谷歌官网的字体文件你说的是这个吗:https://fonts.google.com/noto/specimen/Noto+Color+Emoji 这个已经是Android 15的那个字体了,旧版本的我没找到在哪下载。我们仓库里的是之前从官网下载的。但是现在没有了。后面我们会兼容一下,最晚应该年底会搞定。但不是用FreeType的功能,那个绘制成本太高了,包体也增大很多。相当于是解析出来一个SVG自己来绘制,还有好几种其他的彩色矢量格式。我们可能会采用Java反射的思路去让系统绘制好图片给引擎缓存起来使用。
iOS没有这个问题,他们一直是采用位图字体。谷歌官网的字体文件你说的是这个吗:https://fonts.google.com/noto/specimen/Noto+Color+Emoji 这个已经是Android 15的那个字体了,旧版本的我没找到在哪下载。我们仓库里的是之前从官网下载的。但是现在没有了。后面我们会兼容一下,最晚应该年底会搞定。但不是用FreeType的功能,那个绘制成本太高了,包体也增大很多。相当于是解析出来一个SVG自己来绘制,还有好几种其他的彩色矢量格式。我们可能会采用Java反射的思路去让系统绘制好图片给引擎缓存起来使用。
好的 大佬加油 我先用你提供的字体文件去适配
问一个细节,你现在是自己从系统路径查询到emoji字体的完整路径传递引擎创建typeface的麽?
@domchen 就是参考libpag的代码 ,从系统的字体文件列表里查询的字体列表,不同的是 ,我直接用几个emoji字符读取glyphid ,都读的到基本基本就确认为emoji字体
了解。