前言
文字绘制其实内容太细,而且可能不常用,确实我工作这么久,没用到过几次,这里就快速总结一下API,做下笔记吧。
绘制文字的方式:
// 最基本的方法drawText(), 注意很重要的一点,x,y的坐标是指文字左下角的坐标
canvas.drawText(text, x, y, paint);
// 对中国人没用,某些国家的文字形状会相互影响,单写是一个样儿, 和别的字连在一起又一个样
canvas.drawTextRun();
// 沿着一条Path来绘制文字, 拐弯处记得用圆角
canvas.drawTextOnPath(text, path, x, y, paint);
// 绘制多行文字,对文字的排列和样式没有太复杂的要求,使用StaticLayout
StaticLayout
Paint对文字绘制的辅助
// 设置文字大小
setTextSize(float size);
// 设置字体
setTypeface(Typeface typeface);
// 是否使用伪粗体
setFakeBoldText(boolean fakeBoldText);
// 是否使用删除线
setStrikeThruText(boolean strikeThruText);
// 是否加下划线
setUnderlineText(boolean underlineText);
// 设置文字横向错切角度,也就是倾斜角度
setTextSkewX(float skewX);
// 设置文字横向放缩,也就是胖瘦
setTextScaleX(float scaleX);
// 设置字符间距
setLetterSpacing(float letterSpacing);
// 通过CSS的font-feature-settings的方式来设置文字
setFontFeatureSettings("smcp");
// 设置文字的对齐方式
setTextAlign(Paint.Align align);
// 设置语言区域,比如简体中文、繁体中文
setTextLocale(Locale locale);
// 设置字体微调, 说白了就是字体太小的时候,为了能看的更细致,现在手机分辨率那么高,基本没用了
setHinting(int mode);
// 此方法对中国人没用,优化文字的高度,看起来更美观些
setElegantTextHeight(boolean elegant);
// 开启次像素级的抗锯齿
setSubpixelText(boolean subpixelText);
// 这个没搞懂
setLinearText(boolean linearText);
测量文字尺寸类
// 获取推荐的行距
getFontSpacing();
// 获取Paint的FontMetrics
getFontMetrics();
// 获取文字的显示范围
getTextBounds(text, start, end, bounds);
// 测量文字的宽度并返回
float measureText(text);
// 获取字符串中每个字符的宽度,并把结果填入widths
getTextWidths(String text, float[] widths);
// 测量文字宽度,在给出宽度上限的前提下测量文字的宽度,超出上限,就截断
int breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth);
// 计算某个字符处光标的X坐标
getRunAdvance(text, start, end, contextStart, contextEnd, isRtl, offset);
// 给出一个位置的像素值,计算文字中最接近这个位置的字符偏移量
getOffsetForAdvance(text, start, end, contextStart, contextEnd, isRtl, advance);
// 检查置顶的字符串中是否是一个单独的字形
hasGlyph(String string);
总结
1、关于文字绘制,最常用的可能只是drawText()
2、StaticLayout可以解决文字换行的问题
3、可以设置文字的大小,风格,什么删除线,下划线,字体倾斜,字体胖瘦,字符间距
4、可以测量文字的宽度,获取文字的显示范围等
这一章的内容真的是很细很细了,而且很多不常用,并不需要背会它们,而是知道有这么个东西,大概怎么用就行,真的用到了可以回来看一看。
贴个HenCoder的链接:自定义View-drawText()
来源:https://blog.csdn.net/pengbo6665631/article/details/98627300