一 canvas 绘制文字的方式
1 drawText(String text, float x, float y, Paint paint)
2 drawTextRun() 它和 drawText() 一样都是绘制文字,但加入了两项额外的设置——上下文和文字方向
3 drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint ) 沿着一条 Path 来绘制文字 hOffset 和 vOffset 分别是 横向和纵向 方向的 偏移量
4 StaticLayout 绘制多行文字
二 paint对文字绘制的辅助
1 设置文字显示效果
1 Paint.setTextSize(float textSize) 设置文字大小
2 Paint.setTypeface(Typeface typeface) 设置文字字体
读取资源文件字体方法
paint.typeface = Typeface.createFromAsset(context.assets, "Satisfy-Regular.ttf")
canvas.drawText(text, 100f, 600f, paint)
3 Paint.setFakeBoldText(boolean user) 是否使用伪粗体
4 Paint.setStrikeThroughText(boolean strikeThruText) 是否添加删除线
5 Paint.setUnderlineText(boolean underlineText) 是否添加下划线
6 Paint.setTextSkewX(float skewX) 设置文字横向错切角度。其实就是文字倾斜度的啦。
7 Paint.setTextScaleX(float scaleX) 设置文字横向缩放 也就是文字变胖变瘦
8 Paint.setLetterSpacing(float letterSpacing) 设置字符间距。默认值是 0。
9 Paint.setFontFeatureSettings(String settings) 用 CSS 的 font-feature-settings 的方式来设置文字
paint.setFontFeatureSettings("smcp"); // 设置 "small caps"
canvas.drawText("Hello HenCoder", 100, 150, paint);
10 Paint.setTextAlign(Paint.Align align) 设置文字对齐方式 一共有三个值:LEFT CENTER 和 RIGHT。默认值为 LEFT
11 Paint.setTextLocale(Locale locale) 设置文字绘制的地区 也就是大陆和台湾 同一个字 有不同写法
12 Paint.setHinting(int mode) 设置是否启用字体的 hinting (字体微调)
1 测量文字尺寸类
1 Paint.getFontSpacing() 获取推荐的行距 即推荐的两行文字的 baseline 的距离
2 Paint.getFontMetrics() 获取FontMetrics 一个相对专业的工具类 提供几个文字排印方面的数值
top/bottom 它们的作用是限制所有字形( glyph )的顶部和底部范围
ascent/descent 它们的作用是限制普通字符的顶部和底部范围
leading 指的是行的额外间距,即对于上下相邻的两行,上行的 bottom 线和下行的 top 线的距离
baseline 它的作用是作为文字显示的基准线
1 Paint.getFontSpacing() 获取推荐的行距 即推荐的两行文字的 baseline 的距离
3 Paint.getTextBounds(String text,int start,int end,Rect bounds) 获取文字的实际 显示范围 参数里 text 是要测量的文字,start 和 end 分别是文字的起始和结束位置,bounds 是存储文字显示范围的对象,方法在测算完成之后会把结果写进 bounds
4 Paint.measureText(String text)测量文字的实际占用宽度并返回
val paint= Paint()
paint.textSize=48f
canvas.drawText("Hello HenCoder",100f,100f,paint)
val width=paint.measureText("Hello HenCoder")
canvas.drawLine(100f, 100f, 100f + width, 100f, paint)
5 Paint.getTextWidths(String text,float[] widths) 获取每个字符的宽度 放入 数组 widths中
6 Paint.breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth) 这个方法也是用来测量文字宽度的。但和 measureText() 的区别是, breakText() 是在给出宽度上限的前提下测量文字的宽度。如果文字的宽度超出了上限,那么在临近超限的位置截断文字。
7 光标相关
1 Paint.getRunAdvance(CharSequence text, int start, int end, int contextStart, int contextEnd, boolean isRtl, int offset) 计算某个字符出 光标的坐标的x值
2 Paint.getOffsetForAdvance(CharSequence text, int start, int end, int contextStart, int contextEnd, boolean isRtl, float advance)
给出一个位置的像素值,计算出文字中最接近这个位置的字符偏移量(即第几个字符最接近这个坐标
getOffsetForAdvance() 配合上 getRunAdvance() 一起使用,就可以实现「获取用户点击处的文字坐标」的需求
8 Paint.hasGlyph(String string)检查指定的字符串中是否是一个单独的字形 (glyph)。最简单的情况是,string 只有一个字母(比如a)。