前言
文字绘制其实内容太细,而且可能不常用,确实我工作这么久,没用到过几次,这里就快速总结一下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()
分割线-------------------------------------------------------
实践
// 1 绘制文字
canvas.drawText(text, 50, 100, paint);
// 2 绘制出带有换行的文字
staticLayout = new StaticLayout(text, textPaint, 600, Layout.Alignment.ALIGN_NORMAL, 1, 0, true);
canvas.save();
canvas.translate(50, 40);
staticLayout.draw(canvas);
canvas.restore();
// 3 设置文字大小
paint.setTextSize(20);
// 4 设置不同风格的字体
paint.setTypeface(Typeface.SERIF);
// 5 设置伪粗体
paint.setFakeBoldText(true);
// 6 设置删除线
paint.setStrikeThruText(true);
// 7 设置下划线
paint.setunderlineText(true);
// 8 设置文字倾斜
paint.setTextSkewX(-0.5f);
// 9 设置文字变胖变瘦
paint.setTextScaleX(1.2f);
// 10 设置文字对齐方法
paint.setTextAlign(Paint.Align.LEFT);
// 11 获取推荐的行距
paint.getFontSpacing();
// 12 测量出文字宽度,然后让文字相邻绘制
float measureTextWidth = paint.measureText(text1);
canvas.drawText(text1, 50, 200, paint1);
canvas.drawText(text2, 50 + measureTextWidth, 200, paint2);
// 13 获取文字的显示范围
// 通过paint.getTextBounds()方法获取文字显示范围矩形的大小
// 用它们的top和bottom计算出中间值
// 然后计算出文字的绘制位置
// 这种算法可以让文字精准地居中
// 14 计算出文字的显示区域
// 可以让不同的文字的baseline对齐
paint.getFontMetrics();