android drawtext 方法,Android 文字绘制(DrawText)技术总结

这里的绘制文字不是直接调用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 文字垂直居中

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

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

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

Android之TextView文字绘制流程

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

drawText文字绘制知识

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

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

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

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

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

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

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

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

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

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

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

随机推荐

HTTP认证机制(翻译)

发现一篇介绍HTTP认证的好文章,就尝试翻译了一下,记录在下面.(翻译的很挫,哈哈哈) 原文: http://frontier.userland.com/stories/storyReader$215 ...

myeclipse中的文件内容被覆盖如何恢复

今天无意中,运行文件把原先的文件给覆盖掉了,通过查阅资料发现可以通过这样去恢复 点击被覆盖后的文件------->右击--------->选择replace with------>p ...

Android中的单元测试

2015年5月19日 23:10     在Android中,已经内置了Junit所以不需要在导包.只要继承AndroidTestCase类就可以了.     首先需要修改AndroidManifes ...

领域模型(Domain Model)

领域模型(Domain Model) 一:面向对象设计中最简单的部分与最难的部分 如果说事务脚本是 面向过程 的,那么领域模型就是 面向对象 的.面向对象的一个很重要的点就是:“把事情交给最适合的类去 ...

SwaggerUI笔记

关于 Swagger Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API. S ...

linux atoi

atoi 只能针对字符串为数字, 对字符串为十六进制.八进制的不能进行转化

thinkphp5 学习笔记

一.开发规范: 二.API: 1.数据输出:新版的控制器输出采用 Response 类统一处理,而不是直接在控制器中进行输出,通过设置 default_return_type 就可以自动进行数据转换处 ...

Linux配置多个Tomcat同时运行

Linux系统下怎样配置多个Tomcat同时运行呢,首先修改变量为第一个tomcat,然后修改第二个tomcat启动的脚本 1.修改环境变量 # vi /etc/profile ####### 工程1 ...

mysql (主从复制)(proxy , Amoeba)

原址如下: http://heylinux.com/archives/1004.html Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中 ...

java web程序启动加载 ContextLoaderListener

浅析ContextLoaderListener 大家可能对下面这段代码再熟悉不过了 contextConfigLocat ...

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值