drawText() 文字的绘制

读Hencoder大神文章,记录笔记
http://hencoder.com/ui-1-3/
https://blog.csdn.net/a136447572/article/details/80259738
简介
上期的 Paint 详解里已经说过,文字的绘制所能控制的内容太多太细,必须拆成单独的一期专门来讲。今天这期,就是来把这些细节讲清楚的。

需要说明的有两点:

和上期一样,这期讲的是细节,其中有一部分内容并不是很常用,所以这期你不必要求自己把内容全部背会,而只要做到全部理解,知道都有什么东西,大概怎么用就好,到你真正需要用的时候再拐回来看就是;
除了常用和不常用的内容,本期还会讲到一些比较偏门的细节。这些偏门几乎永远不会用到,我讲这些偏门的目的也只是为了做到知识的全覆盖,帮你破开迷雾解开谜团,把那些「始终没有搞懂,也不知道有没有用」的 API 解释出来。有的时候,一样东西你确定了它确实没用,也就够了。所以如果遇到这些偏门的内容,你感兴趣,看看就好;不感兴趣,不看也罢——总之,不要把太多精力放在它们身上。
下面进入正题。
1 Canvas 绘制文字的方式
1.1 drawText(String text, float x, float y, Paint paint)

String text = "Hello HenCoder";

...

canvas.drawText(text, 200, 100, paint);  

1.2 drawTextRun()
1.3 drawTextOnPath()
1.4 StaticLayout

String text1 = "Lorem Ipsum is simply dummy text of the printing and typesetting industry.";  
StaticLayout staticLayout1 = new StaticLayout(text1, paint, 600,  
        Layout.Alignment.ALIGN_NORMAL, 1, 0, true);
String text2 = "a\nbc\ndefghi\njklm\nnopqrst\nuvwx\nyz";  
StaticLayout staticLayout2 = new StaticLayout(text2, paint, 600,  
        Layout.Alignment.ALIGN_NORMAL, 1, 0, true);

...

canvas.save();  
canvas.translate(50, 100);  
staticLayout1.draw(canvas);  
canvas.translate(0, 200);  
staticLayout2.draw(canvas);  
canvas.restore();  

2 Paint 对文字绘制的辅助
2.1 设置显示效果类
设置文字大小。
2.1.1 setTextSize(float textSize)
设置字体。
2.1.2 setTypeface(Typeface typeface)
是否使用伪粗体。
2.1.3 setFakeBoldText(boolean fakeBoldText)
是否加删除线。
2.1.4 setStrikeThruText(boolean strikeThruText)
是否加下划线。
2.1.5 setUnderlineText(boolean underlineText)
设置文字横向错切角度。其实就是文字倾斜度的啦。
2.1.6 setTextSkewX(float skewX)
设置文字横向放缩。也就是文字变胖变瘦。
2.1.7 setTextScaleX(float scaleX)
设置字符间距。默认值是 0。
2.1.8 setLetterSpacing(float letterSpacing)
用 CSS 的 font-feature-settings 的方式来设置文字。
2.1.9 setFontFeatureSettings(String settings)
设置文字的对齐方式。一共有三个值:LEFT CETNER 和 RIGHT。默认值为 LEFT。
2.1.10 setTextAlign(Paint.Align align)
设置绘制所使用的 Locale。
2.1.11 setTextLocale(Locale locale) / setTextLocales(LocaleList locales)
设置是否启用字体的 hinting (字体微调)。
2.1.12 setHinting(int mode)
声明:这个方法对中国人没用,不想看的话可以直接跳过,无毒副作用。
2.1.13 setElegantTextHeight(boolean elegant)
是否开启次像素级的抗锯齿( sub-pixel anti-aliasing )。
2.1.14 setSubpixelText(boolean subpixelText)

2.2 测量文字尺寸类
获取推荐的行距。
2.2.1 float getFontSpacing()
/* —————————————————-*/
获取 Paint 的 FontMetrics。
2.2.2 FontMetircs getFontMetrics()
/* —————————————————-*/
获取文字的显示范围。
2.2.3 getTextBounds(String text, int start, int end, Rect bounds)
/* —————————————————-*/
测量文字的宽度并返回。
2.2.4 float measureText(String text)
/* —————————————————-*/
获取字符串中每个字符的宽度,并把结果填入参数 widths。
2.2.5 getTextWidths(String text, float[] widths)
/* —————————————————-*/
这个方法也是用来测量文字宽度的。但和 measureText() 的区别是, breakText() 是在给出宽度上限的前提下测量文字的宽度。如果文字的宽度超出了上限,那么在临近超限的位置截断文字。
2.2.6 int breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth)
/* —————————————————-*/
对于一段文字,计算出某个字符处光标的 x 坐标。 start end 是文字的起始和结束坐标;contextStart contextEnd 是上下文的起始和结束坐标;isRtl 是文字的方向;offset 是字数的偏移,即计算第几个字符处的光标。
2.2.7.1 getRunAdvance(CharSequence text, int start, int end, int contextStart, int contextEnd, boolean isRtl, int offset)
/* —————————————————-*/
给出一个位置的像素值,计算出文字中最接近这个位置的字符偏移量(即第几个字符最接近这个坐标)。
2.2.7.2 getOffsetForAdvance(CharSequence text, int start, int end, int contextStart, int contextEnd, boolean isRtl, float advance)
/* —————————————————-*/
检查指定的字符串中是否是一个单独的字形 (glyph)。最简单的情况是,string 只有一个字母(比如 a)。
2.2.8 hasGlyph(String string)

猜你喜欢

转载自blog.csdn.net/a136447572/article/details/80289811
今日推荐