Android 使用View绘制文字(DrawText)技术总结

转载请注明出处: http://www.cnblogs.com/renhui/p/7453534.htmlhtml

这里的绘制文字不是直接调用TextView.setText(String content)去展现文字内容。而是在View上面经过 canvas.drawText(text, x, y,textPaint) 的方式直接进行文字的绘制。android

1、基本的文字绘制方式

canvas.drawText的方式,须要咱们计算好要绘制的文字的起始位置,并经过移动画布的来移动到指定的位置,绘制文字完成后而后再复原画布的位置。canvas

canvas.translate(x, y); // 挪动canvas的坐标原点
canvas.drawText(text, x, y, tp);
canvas.translate(-x, -y); // 恢复canvas的坐标原点

经过这段代码,就能够将文字绘制在指定的位置。编辑器

可是有时候咱们发现,若是须要绘制的内容不少的时候,直接使用 canvas.drawText 存在很大的问题,列举其中几个问题以下:函数

  • 只能在一行进行绘制,不会自动换行。
  • 即便内容里面存在'\n'等换行字符,但是绘制出来的文字仍是在一行里面,'\n'字符展现出来的效果仅仅是一个空格。
  • 超出屏幕的内容是看不到的。

那么怎么处理这个问题呢?Android 的API 里面 有一个很是棒的工具类 -- StaticLayout。经过StaticLayout,咱们就可以实现了文本绘制换行处理工具

2、使用StaticLayout绘制文本

public void onDraw(Canvas canvas){
  super.onDraw(canvas);
  TextPaint tp = new TextPaint();
  tp.setColor(Color.BLUE);
  tp.setStyle(Style.FILL);
  tp.setTextSize(50);
  String message = "8月30日中午,法制晚报·见解新闻记者从中国电信、中国联通、中国移动获悉,三大运营商将从9月1日起全面取消手机国内长途费和漫游费(不含港澳台,下同),比原计划的10月1日提早一个月完成。用户无需申请,自动生效。";
  StaticLayout myStaticLayout = new StaticLayout(message, tp, canvas.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
  myStaticLayout.draw(canvas);
  canvas.restore();
}

上面这段代码就是使用StaticLayout绘制文本的基本使用方式。运行后发现跟TextView的效果是同样的,经过阅读android源码能够发现,其实TextView也是调用StaticLayout来实现换行的。字体

StaticLayout的构造函数有三个:动画

public StaticLayout(CharSequence source, // 须要分行的字符串
TextPaint paint, // 画笔对象
int width, // layout的宽度,字符串超出宽度时自动换行
Layout.Alignment align, // 对齐方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三种
float spacingmult, // 相对行间距,相对字体大小,1.5f表示行间距为1.5倍的字体高度。
float spacingadd, // 在基础行距上添加多少(实际行间距等于二者和)
boolean includepad)
public StaticLayout(CharSequence source, // 须要分行的字符串
int bufstart, // 须要分行的字符串从第几位开始
int bufend, // 须要分行的字符串到哪里结束
TextPaint paint,  // 画笔对象
int outerwidth, // layout的宽度,字符串超出宽度时自动换行
Layout.Alignment align, // 对齐方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三种
float spacingmult, // 相对行间距,相对字体大小,1.5f表示行间距为1.5倍的字体高度。
float spacingadd, // 在基础行距上添加多少
boolean includepad)
public StaticLayout(CharSequence source, // 须要分行的字符串
int bufstart,  // 须要分行的字符串从第几位开始
int bufend, // 须要分行的字符串到哪里结束
TextPaint paint, // 画笔对象
int outerwidth, // layout的宽度,字符串超出宽度时自动换行。
Layout.Alignment align, // 对齐方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三种。
float spacingmult, // 相对行间距,相对字体大小,1.5f表示行间距为1.5倍的字体高度。
float spacingadd, // 在基础行距上添加多少
boolean includepad,
TextUtils.TruncateAt ellipsize,
int ellipsizedWidth)

3、使用StaticLayout的情景

咱们已经知道,使用StaticLayout能够很好的帮助咱们处理文字绘制时的换行问题,那么什么地方咱们可以用到StaticLayout呢?下面我能够列举几个例子:ui

1. 辅助图文混排的编辑器,生成图文一体的长图 -- 须要自定义View绘制的基础。spa

2. 音乐播放器类,桌面歌词滚动(可带颜色)

相关文章
相关标签/搜索