一、Canvas 绘制文字相关api
1、canvas.drawText(String text, float x, float y, Paint paint)
注释:
text : 文字的内容
x,y:文字的坐标,y为文字的基线(baseline)位置,并非文字的左上角;
x的位置为所绘制文字的左边再往左一点点,因为字符的左右两边会留出一部分空隙,用于文字之间的间隔,以及文字和边框的间隔。所以绝大多数的字符,它们的宽度都是要略微大于显示的宽度的
paint:画笔
2、canvas.drawTextRun()
此方法对中国人没用,是在API 23 新加入的方法。他和drawText()一样都是绘制文字,但加入了俩项额外的设置——上下文和文字方向——用于辅助一些文字结构比较特殊的语言的绘制。
3、drawTextOnPath(String text,Path path,float hOffset,float vOffset,Paint paint)
功能:沿着一条Path来绘制文字
text:绘制文字内容
path:绘制路径
hOffset:文字相对于Path的水平偏移量
vOffset:文字相对于Path的竖直偏移量
二、StaticLayout
staticlayout是使用canvas来进行文字的绘制,不过并不是使用canvas的方法。Canvas.drawText()方法只能绘制单行的文字,而不能换行。其不能在view的边缘自动折行。也不能在换行符 \n处换行,其只是加了个空格和n无换行效果。如果需要绘制多行的文字,你必须自行把文字切断后分多次使用drawText来进行绘制。
StaticLayout为android.text.Layout的子类,其是纯粹用来绘制文字的,其支持换行,它既支持文字设置宽度上限来让文字自动换行,也会在\n处主动换行。
StaticLayout初始化方法:
StaticLayout(CharSequence source, TextPaint paint, int width, Layout.Alignment align, float spacingmult, float spacingadd, boolean includeadd)
width:文字区域的宽度,达到这个宽度后自动换行
align:文字的对其方式
spacingmult:行间距的倍数,通常设为1
spacingadd:行间距的额外增加值,通常情况设为0
includepad:是否在文字上下添加额外的空间,来避免某些过高的字符的绘制出现越界
String text = " This is the staticlayout sample to release the text line feed"
StaticLayout staticLayout = new StaticLayout(text,paint,500,LayoutAlignment.ALIGN_NORMAL,1,0,true);
staticLayout.draw(canvas);
三、Paint 对文字绘制的辅助
1、设置文字的大小
paint.setTextSize();
2、设置文字的字体
设置不同的Typeface就可以显示不同的字体
//设置系统自带的字体
paint.setTypeface(Typeface.DEFAULT);
paint.setTypeface(Typeface.SERIF);
//设置自定义的某套字体
paint.setTypeface(Typeface.createFromAsset(getContext().getAssets(),"Satisy-Regular.ttf"));
3、设置使用伪粗体
之所以叫伪粗体,因为它并不是通过选用更高weight的字体让文字变粗,而是通过程序在运行时把文字给描粗了。
paint.setFakeBoldText(true);
4、是否加删除线
paint.setStrikeThruText(true);
5、是否加下划线
paint.setUnderlineText(true);
6、设置文字横向错切角度即文字的倾斜度
paint.setTextSkewX(-0.5f);
7、设置文字横向缩放,即文字的胖瘦
paint.setTextScaleX(1.2f);
8、设置字符间间距,默认为0
paint.setLetterSpacing(0.2f);
9、用CSS的font-feature-settings的方式来设置文字
主要设置一些文字的次要属性,可以简单了解下
paint.setFontFeatureSettings("smcp");
10、设置文字的对齐方式
文字的对齐方式一共有三种:LEFT CENTER和RIGHT 默认值为LEFT
paint.setTextAlign(Paint.ALign.CENTER);
11、设置文字的地域
paint.setTextLocale(Locale.TAIWAN) //简体中文
paint.setTextLocale(Locale.JAPAN) //日语
12、是否启用字体的hinting(字体微调)
现在的 Android 设备大多数都是是用的矢量字体。矢量字体的原理是对每个字体给出一个字形的矢量描述,然后使用这一个矢量来对所有的尺寸的字体来生成对应的字形。由于不必为所有字号都设计它们的字体形状,所以在字号较大的时候,矢量字体也能够保持字体的圆润,这是矢量字体的优势。不过当文字的尺寸过小(比如高度小于 16 像素),有些文字会由于失去过多细节而变得不太好看。 hinting 技术就是为了解决这种问题的:通过向字体中加入 hinting 信息,让矢量字体在尺寸过小的时候得到针对性的修正,从而提高显示效果。
paint.setHinting(int mode)