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

这里的绘制文字不是直接调用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 存在很大的问题,列举其中几个问题如下:

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

那么怎么处理这个问题呢?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, // 画笔对象
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)

三、使用StaticLayout的情景

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

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

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

Android 文字绘制(DrawText)技术总结的更多相关文章

  1. Android 文字垂直居中

    android中自定义控件,自己绘制文字canvas.drawText()的时候,怎样才能让文字垂直居中那? drawText()的方法说明 也就是使用paint画笔在(X,Y)处进行绘制,X为横向坐 ...

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

    转载请注明出处: http://www.cnblogs.com/renhui/p/7453534.html 这里的绘制文字不是直接调用TextView.setText(String content)去 ...

  3. Android之TextView文字绘制流程

    一:TextView的onDraw()方法: 1.第一句restartMarqueeIfNeeded()绘制字幕滚动. protected void onDraw(Canvas canvas) { r ...

  4. drawText文字绘制知识

    drawText(String text, float x, float y, Paint paint) x,y是基于文字基本线的,而不是android坐标系的左上角. 使用staticLayout进 ...

  5. Android UI 绘制过程浅析(五)自定义View

    前言 这已经是Android UI 绘制过程浅析系列文章的第五篇了,不出意外的话也是最后一篇.再次声明一下,这一系列文章,是我在拜读了csdn大牛郭霖的博客文章<带你一步步深入了解View> ...

  6. 如何基于纯GDI实现alpha通道的矢量和文字绘制

    今天有人在QQ群里问GDI能不能支持带alpha通道的线条绘制? 大家的答案当然是否定的,很多人推荐用GDI+. 一个基本的图形引擎要包括几个方面的支持:位图绘制,文字绘制,矢量绘制(如矩形,线条). ...

  7. 简单研究Android View绘制三 布局过程

    2015-07-28 17:29:19 这一篇主要看看布局过程 一.布局过程肯定要不可避免的涉及到layout()和onLayout()方法,这两个方法都是定义在View.java中,源码如下: /* ...

  8. Android中直播视频技术探究之---基础知识大纲介绍

    一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐方式,但是作为一个高技术的,我们除了看看,更 ...

  9. android平台短视频技术之 视频编辑的经验分享.

    android平台短视频技术之 视频编辑的经验分享. 提示一: 各位看官,这里分享的是视频编辑,即剪切/拼接/分离/合并/涂鸦/标记/叠加/滤镜等对视频的编辑操作.不是流媒体网络播放等功能,请注意. ...

随机推荐

  1. SecureFX 乱码问题

    英文平时连终端的都是用SecureCRT, 今天试了一些SecureFX, 结果乱码了, 把redhat下的中文桌面标题显示乱码, 然后参考了一下别的前辈, 完美解决, 下面是解决办法: 1.找到配置 ...

  2. AddBinary

    二进制加法 输入2个字符串,字符串内由0和1组成:计算二者之和,返回字符串 Given two binary strings, return their sum (also a binary stri ...

  3. WEB安全:文件上传漏洞

    文件上传漏洞过程 用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力. 一般的情况有: 上传文件WEB脚本语言,服务器的WEB容器解释并执行了用户上传的脚本,导致代码执行: ...

  4. spring 页面跳转

    RedirectAttributes  的两个方式的获取总结:1:addFlashAttribute @RequestMapping(value="hello") public S ...

  5. 【SignalR学习系列】8. SignalR Hubs Api 详解(.Net C# 客户端)

    建立一个 SignalR 连接 var hubConnection = new HubConnection("http://www.contoso.com/"); IHubProx ...

  6. 【nodejs】nodejs 的linux安装(转)

    (一) 编译好的文件 简单说就是解压后,在bin文件夹中已经存在node以及npm,如果你进入到对应文件的中执行命令行一点问题都没有,不过不是全局的,所以将这个设置为全局就好了. ./node -v ...

  7. myeclipse项目部署到idea常见问题

    由于myeclipse是付费产品,经过几次破解不成功后,遂弃之,转投IntelliJ IDEA门下.但这就出现一个问题了,以前用的eclipse.myeclipse以及spring tools sui ...

  8. Eclipse、maven项目常见问题

    阿里云maven仓库地址: <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> &l ...

  9. 花了一年时间开发出来的EZNest 自动套料软件

    随着国内钢结构制造业的迅猛发展,市场竞争也愈演愈烈.近来钢材价格的大幅攀升,节约用材已成为企制胜的戈键,提高钢材的利用车自然就成了目前许多企业十分关心的一件事.对十大型钢结构生产制造商来说,如留在传统 ...

  10. 【bzoj2819】Nim

    Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游 ...