这里的绘制文字不是直接调用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 自定义 View 绘制

在 Android 自定义View 里面,介绍了自定义的View的基本概念.同时在 Android 控件架构及View.ViewGroup的测量 里面介绍了 Android 的坐标系 View.Vie ...

android自定义View绘制天气温度曲线

原文:android自定义View绘制天气温度曲线 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012942410/article/detail ...

Android之View绘制流程源码分析

版权声明:本文出自汪磊的博客,转载请务必注明出处. 对于稍有自定义View经验的安卓开发者来说,onMeasure,onLayout,onDraw这三个方法都不会陌生,起码多少都有所接触吧. 在安卓中 ...

Android笔记--View绘制流程源码分析(二)

Android笔记--View绘制流程源码分析二 通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中: Window的建立(activit.attach生成), ...

Android笔记--View绘制流程源码分析(一)

Android笔记--View绘制流程源码分析 View绘制之前框架流程分析 View绘制的分析始终是离不开Activity及其内部的Window的.在Activity的源码启动流程中,一并包含 着A ...

Android中View绘制流程以及invalidate()等相关方法分析

[原文]http://blog.csdn.net/qinjuning 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简 ...

Android中View绘制流程以及invalidate()等相关方法分析(转载的文章,出处在正文已表明)

转载请注明出处:http://blog.csdn.net/qinjuning 前言: 本文是我读第13章----View工作原理总结而成的,在此膜拜下作者 .同时 ...

android之View绘制

Android系统的视图结构的设计也采用了组合模式,即View作为所有图形的基类,Viewgroup对View继承扩展为视图容器类,由此就得到了视图部分的基本结构--树形结构 View定义了绘图的基本 ...

Android中View绘制流程以及invalidate()等相关方法分析(转)

转自:http://blog.csdn.net/qinjuning 前言: 本文是我读第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴 ...

随机推荐

VS2010 下 将 EntityFramework 的版本从 4.0 升级到 5.0

1. 下载安装 EF 5.x DbContext Generator for C# : 下载地址:https://visualstudiogallery.msdn.microsoft.com/da74 ...

Activity onDestroy() 回调缓慢问题分析及完美解决方案

说到Acitivity的onDestroy,对所有的Android开发者都很熟悉,但是不一定都知道里面存在着一些坑,分享给大家,以后踩中的时候可以应急 用Activity的时候,会发现如下问题: 有时 ...

【分享】通过Excel生成批量SQL语句,处理大量数据的好办法

我们经常会遇到这样的要求:用户给发过来一些数据,要我们直接给存放到数据库里面,有的是Insert,有的是Update等等,少量的数据我们可以采取最原始的办法,也就是在SQL里面用Insert into ...

python 输出字符串如果遇到字典

>>> d = {'a':1} >>> print '%s' % 1,d 1 {'a': 1} >>> print '%s %s' % 1,d T ...

KVM如何以HADOOP作共享存储?

看到西部数码的作法. 回想IBM的SMARTCLOUD作法,这主要就是应用了HDFS? 外加上HBASE和ZOOKEEPER保驾的? 然后,再想到,这HDFS和OPENSTATCK的SWIFT...纠 ...

python 强制结束线程的坑

网上流传了两种能强制结束线程的错误姿势 第一种:通过setDaemon来结束线程 http://www.cnblogs.com/jefferybest/archive/2011/10/09/22040 ...

文本变语音引擎 ekho

https://github.com/donaldlee2008/ekho https://www.oschina.net/p/ekho

Flask 扩展 用户会话

pip install flask-login 接下来创建扩展对象实例: from flask import Flask from flask_login import LoginManager ap ...

k8s storageClass对接nfs

前提:已存在一个nfs服务 192.168.137.11:/home/nfs_data 下面以rbac方式对接nfs 1.创建/root/k8s-nfs-rbac/serviceaccount.yam ...

android drawtext文字大小,Android 使用View绘制文字(DrawText)技术总结相关推荐

  1. html canvas图片上绘制文字,如何用HTML5 CANVAS绘制文字

    您可能感兴趣的话题: 绘制文字 核心提示:如何在HTML5 canvas上绘制绘制文字,并且可以设置文字的字体,大小和颜色. 我们可以在HTML5 canvas上绘制绘制文字,并且可以设置文字的字体, ...

  2. android覆盖扩散动画,[Android]多层波纹扩散动画——自定义View绘制

    之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了.直到这次-- 一.另一种动画需求 多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现.但是对于 多个元素.非页 ...

  3. android 水波纹扩散动画,[Android]多层波纹扩散动画——自定义View绘制

    之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了.直到这次-- 一.另一种动画需求 多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现.但是对于 多个元素.非页 ...

  4. Android通知栏字体大小,Android通知栏介绍与适配总结(上篇)

    此文已由作者黎星授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 由于历史原因,Android在发布之初对通知栏Notification的设计相当简单,而如今面对各式各样的通知 ...

  5. android list字体大小,android自定义ListPreference字体大小

    这篇博客算是自己的一个记录吧,组长给了一个任务,需要实现一个紧急广播的一系列设置功能,但是客户那边设置界面的字体大小有特殊的要求,看了一下,对于ListPreference这样的控件,android系 ...

  6. android auto 字体大小,Android中给TextView字体大小用dp还是sp?dp和sp有什么区别?

    dp,sp都会根据屏幕ppi显示大小不同. ppi的运算方式是: PPI = (开根号(长度像素数² + 宽度像素数²)) / 屏幕对角线英寸数 dp:Density-independent pixe ...

  7. android 评价 星星大小,Android RatingBar 评价栏 星星 大小 样式 设置

    Android系统自带RatingBar,无法直接指定宽高,不然会出现无法全部显示的情况,使用系统自带的两个主题 ?android:attr/ratingBarStyleIndicator和 ?and ...

  8. android 设置视频大小,android – 调整视频大小

    我正在尝试动态设置 Android VideoView的大小.我看过StackOverflow以及互联网;我找到的最佳解决方案是从 here开始.我已经将我的实现放在下面: public class ...

  9. android程序字体大小,Android如何动态调整应用字体大小详解

    前言 为什么要动态设置字体大小?由于项目面对的是中老年客户项目中自带的字体无法满足客户需求. Android应用字体大小默认随系统设置的字体大小而变化,但您可能不希望您的应用字体大小随系统设置变化,想 ...

  10. android程序字体大小,Android 动态调整应用字体大小

    Android应用字体大小默认随系统设置的字体大小而变化,但您可能不希望您的应用字体大小随系统设置变化,想要自己控制,例如微信.本文简单介绍一下如何实现应用字体大小动态调整而不是依赖系统设置 字体大小 ...

最新文章

  1. 非常实用的Windows7进阶功能
  2. Gulp 之图片压缩合并
  3. reactjs组件通信方式总结
  4. shared_ptr 循环引用问题以及解决办法
  5. Android之webview背景设置为透明无效
  6. 使用 ale.js 制作一个小而美的表格编辑器(1)
  7. 23种常用设计模式的UML类图
  8. 入门第十课 Python语句的编写之while
  9. [JLOI2015]城池攻占 左偏树
  10. 洛谷P2473奖励关——状压DP
  11. 国内计算机期刊SCI收录
  12. 挂靠其入职公司股东名下其他公司,是否有违反竞业协议?
  13. gitlab将个人项目与他人共享设置
  14. 前端常用标签与注意事项
  15. 塑料回收标志相关知识
  16. iOS Apple Pay(银联渠道) 、云闪付
  17. python爬虫豆瓣电影评价_Python 爬虫实战(1):分析豆瓣中最新电影的影评
  18. Oracle入门学习详解
  19. 安笙机器人_演员动态周报 | 李晨王晓晨《北京西城故事》、张翰徐璐《若你安好便是晴天》、包贝尔辛芷蕾《我的机器人女友》...
  20. 商丘工学院c语言试卷,商丘工学院New Radio82期:青春

热门文章

  1. bilibili视频下载到电脑本地教程
  2. linux 上传下载测速
  3. 电子档案管理系统java,电子档案管理系统单点登陆示例
  4. CAD卸载/完美解决安装失败/如何彻底卸载清除干净cad各种残留注册表和文件的方法
  5. ISP(七) CMOS图像传感器内部结构及工作原理
  6. Delphi XE8 TStyleBook的使用
  7. 图表背后的秘密 | 技术指标讲解:唐奇安通道
  8. 谷歌浏览器如何自动运行flash
  9. 在reader中勾选pdf复选框_Excel中设计具有可任意勾选复选框的操作方法
  10. PPT太大怎么进行压缩