转载请注明出处:
这里的绘制文字不是直接调用TextView.setText(String content)去展示文字内容。而是在View上面通过 canvas.drawText(text, x, y,textPaint) 的方式直接进行文字的绘制。
一、基本的文字绘制方式
canvas.drawText的方式,需要我们计算好要绘制的文字的起始位置,并通过移动画布的来移动到指定的位置,绘制文字完成后然后再复原画布的位置。
canvas.translate(x, y); // 挪动canvas的坐标原点 canvas.drawText(text, x, y, tp); canvas.translate(-x, -y); // 恢复canvas的坐标原点通过这段代码,就可以将文字绘制在指定的位置。
但是有时候我们发现,如果需要绘制的内容很多的时候,直接使用 canvas.drawText 存在很大的问题,列举其中几个问题如下:
那么怎么处理这个问题呢?Android 的API 里面 有一个非常棒的工具类 -- StaticLayout。通过StaticLayout,我们就能够实现了文本绘制换行处理
二、使用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, width, // layout的宽度,字符串超出宽度时自动换行 Layout.Alignment align, spacingmult, spacingadd, includepad) bufstart, bufend, // 需要分行的字符串到哪里结束 TextPaint paint, outerwidth, // layout的宽度,字符串超出宽度时自动换行 Layout.Alignment align, spacingmult, spacingadd, includepad) bufstart, bufend, // 需要分行的字符串到哪里结束 TextPaint paint, outerwidth, // layout的宽度,字符串超出宽度时自动换行。 Layout.Alignment align, spacingmult, spacingadd, includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) 三、使用StaticLayout的情景我们已经知道,使用StaticLayout可以很好的帮助我们处理文字绘制时的换行问题,那么什么地方我们能够用到StaticLayout呢?下面我可以列举几个例子:
1. 辅助图文混排的编辑器,生成图文一体的长图 -- 需要自定义View绘制的基础。
2. 音乐播放器类,桌面歌词滚动(可带颜色)