跨平台字体渲染
借鉴的文章:
Skia深入分析5——skia文字绘制的实现
Android's Font Renderer Efficient text rendering with OpenGL ES
万万没想到——flutter这样外接纹理
Text Rendering
flutter/engine/third_party/txt/src
hwui/FontRenderer.cpp
hwui/pipeline/skia/LayerDrawable
FreeTypeLibAndroidJNIDemo
Skia实现的Lottie播放器
libgdx/wiki/Bitmap-fonts
snada/BitmapFontLoader
aosp/libs/hwui/FontRenderer.cpp
https://github.com/libgdx/libgdx/issues/5825
使用CMake交叉编译Skia(下载Demo后,仍需按照文章完成编译)
-矢量文字SDF
libgdx/wiki/Distance-field-fonts
Playing around with distance field font rendering
multi-channel distance field
最后还是选择各个平台的原生API画,比如安卓用的是Canvas DrawText的API:
然后绘制文字参考了以下文章:
HenCoder Android 开发进阶:自定义 View 1-3 文字的绘制
HenCoder Android 开发进阶: 自定义 View 1-2 Paint 详解
文字测量:
Android: Measure Text Height on a Canvas
Measuring text height to be drawn on Canvas ( Android )
查看字体工具 FontLab 7
Android TextView的换行策略
Android换行调试tip:
Painter.measureText()打印的字宽和字号不是完全成正比(即使是画单个字符也不会成正比),比如0.6555倍的字号, kerning为0Painter.measureText()的值会是0.650倍。这样就会导致换行在某些情况下有差异: 文本框2440.6555 = 160; 字号 218.42773 0.6555 = 143.2 字宽246*0.654 = 160; 所以之前换行的转换后不换行了
Painter的textSize设置为142/143/144, measureText("FF")的值都是160.0。设置为148后未166.0,有时候小数位有值,即变化非线性。所以建议在APP层把文字换行,用增加了换行符后的文本替换本来的文本。