android text 绘制

一、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)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前面学习了Android自定义View(一) -- 初识Android自定义View(二) -- Paint详解 ...
    T9的第三个三角阅读 15,668评论 0 26
  • 一、概述 1. 四线格与基线 小时候,我们在刚开始学习写字母时,用的本子是四线格的,我们必须把字母按照规则写在四线...
    addapp阅读 12,381评论 2 17
  • 【Android 自定义View之绘图】 基础图形的绘制 一、Paint与Canvas 绘图需要两个工具,笔和纸。...
    Rtia阅读 14,137评论 5 34
  • 今天,朋友圈里的朋友推荐了这个APP,并这样写道:真心不错的app,有思想,无广告,告别朋友圈的不二选择! 于是马...
    晓青阅读 1,643评论 0 2
  • 最近生活中的一些感悟与你分享: 1. 有时,我们可能会为了回避一些东西而选择其他的路径,可是后来,却发现有些东...
    谢胜兰Athena阅读 2,383评论 0 0

友情链接更多精彩内容