比较基础的一个方法。即绘制文本

使用如下:

Paint paint = new Paint();   

paint.setColor(Color.RED);   // 红色字体
paint.setStyle(Paint.Style.FILL); // 类型
paint.setStrokeWidth(); // 画笔线条宽度
paint.setTextSize(); // 绘制文本大小

// 绘制内容
canvas.drawText("听着music睡 ' blogs" , , , paint);

效果;

可以看下方法:

这篇只讨论第三个方法。

 可以看到 4个参数,第二个、第三个参数 是float类型,实际上就是 绘制的文本的绘制参考坐标。注意这个坐标 不是文本的左上角的那个点,float y 代表 基线的Y位置。

验证一下:

绘制一条蓝色的基线,绘制一个文本。

        Paint paint = new Paint();

        paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(1);
paint.setTextSize(60); int baseLine = 100 ;// 基线的Y坐标
canvas.drawText("abcdefghi",30 , baseLine , paint); // 绘制 (30,baseLine) 为参考点的文本
paint.setColor(Color.BLUE);
canvas.drawLine(30,baseLine ,300,baseLine,paint); // 绘制基线

可以看到,绘制文本的参数(floatx , floaty) 指的是基线的左起点坐标而不是左上角。

扩展:

drawtext除了基线还有另外4条线,称为4格线。

分别是ascent,descent,top,bottom

  • ascent: 系统建议的,绘制单个字符时,字符应当的最高高度所在线
  • descent:系统建议的,绘制单个字符时,字符应当的最低高度所在线
  • top: 可绘制的最高高度所在线
  • bottom: 可绘制的最低高度所在线

怎么获取这4个线的y轴坐标呢,有一个类 FontMetrics

这些属性的值即 与基线的相对y轴距离(可能为负值)

示例:

        int baseLineY = 100 ;

        Paint.FontMetrics fm = paint.getFontMetrics();
float ascent = baseLineY + fm.ascent ; // 制顶线
float descent = baseLineY+fm.descent ; //制低线
float top = baseLineY + fm.top ; // 最顶线
float bottom = baseLineY + fm.bottom ; // 最低限 // 基线
paint.setColor(Color.RED);
canvas.drawLine(baseLineX , baseLineY , 1000 , baseLineY , paint); // 制顶线
paint.setColor(Color.BLUE);
canvas.drawLine(baseLineX,ascent , 1000 , ascent , paint); // 制底线
paint.setColor(Color.GREEN);
canvas.drawLine(baseLineX,descent , 1000 , descent , paint); // 最顶线
paint.setColor(Color.YELLOW);
canvas.drawLine(baseLineX,top,1000,top , paint); // 最底线
paint.setColor(Color.MAGENTA);
canvas.drawLine(baseLineX , bottom , 1000 , bottom ,paint); //写文字
paint.setColor(Color.BLACK);
canvas.drawText("听着music睡 ' blogs" ,baseLineX,baseLineY , paint);

可以看到:

黄色的最顶线top

蓝色的制顶线ascent

红色的基线baseline

绿色的制低线descent

粉色的最低限bottom

自定义控件详解(七):drawText()的更多相关文章

  1. 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析

    第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...

  2. Iptables详解七层过滤

    <Iptables详解七层过滤> 一.防火墙简介 防火墙其实就是一个加固主机或网络安全的一个设备或者软件而已,通过防火墙可以隔离风险区域与安全区域的连接,同时不会妨碍风险区域的访问.当然需 ...

  3. WindowsPhone自定义控件详解(二) - 模板类库分析

    转自:http://blog.csdn.net/mr_raptor/article/details/7251948 WindowsPhone自定义控件详解(一) - 控件类库分析 上一节主要分析了控件 ...

  4. Xamarin+Prism开发详解七:Plugin开发与打包测试

    有了上章[Xamarin+Prism开发详解六:DependencyService与IPlatformInitializer的关系]的基础,现在来理解Plugin开发就简单了. 本文实例代码地址:ht ...

  5. 自定义控件详解(一):Paint类与Canvas类

    前言: 自定义控件必需的两个类:Paint与Canvas Paint    ---  相当于绘图的"笔" Canvas --- 相当于绘图的"纸" 一.Pain ...

  6. 第二章 控件架构与自定义控件详解 + ListView使用技巧 + Scroll分析

    1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWindow将DecorView作为整个应用窗口的根V ...

  7. 自定义控件详解(六):Paint 画笔MaskFilter过滤

    首先看一个API:setMaskFilter(MaskFilter maskfilter): 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等. 以下有两个Ma ...

  8. 自定义控件详解(五):onMeasure()、onLayout()

    前言: 自定义控件的三大方法: 测量: onMeasure(): 测量自己的大小,为正式布局提供建议 布局: onLayout(): 使用layout()函数对所有子控件布局 绘制: onDraw() ...

  9. WindowsPhone自定义控件详解(一) - 控件类库分析

    转自:http://blog.csdn.net/mr_raptor/article/details/7251942 为了让你的应用程序更有个性,我们通常会在WP7开发过程中会自定义自己风格的控件,自定 ...

随机推荐

  1. Redis 图形化监控方案 RedisLive 介绍

    作为一款开源的 Redis 图形化监控工具,RedisLive 提供对 Redis 实例的内存使用情况,接收的客户端命令,接收的请求数量以及键进行监控.RedisLive 的工作原理基于 Redis ...

  2. JavaScript学习笔记(十)——高阶函数之map,reduce,filter,sort

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  3. 项目详解4—haproxy 详解

    一.企业服务架构图及负载均衡的要求 1.场景说明 在企业生产环境中,每天会有很多的需求变更,比如增加服务器.新业务上线.url路由修改.域名配置等等,对于前端负载均衡设备来说,容易维护,复杂度低,是首 ...

  4. 运行java web项目时报错:Several ports (8005, 8080, 8009) required

    运行java web项目时报错:Several ports (8005, 8080, 8009) required 如下图 之所以报上面的错误是因为安装Tomcat的时候,已经把端口8005,8080 ...

  5. JavaScript学习笔记(十四)——对象

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  6. 【JDK1.8】JDK1.8集合源码阅读——TreeMap(二)

    一.前言 在前一篇博客中,我们对TreeMap的继承关系进行了分析,在这一篇里,我们将分析TreeMap的数据结构,深入理解它的排序能力是如何实现的.这一节要有一定的数据结构基础,在阅读下面的之前,推 ...

  7. Windows系统重装

    http://www.ishuo.cn/show/76437.htmlhttp://jingyan.baidu.com/article/d8072ac45d4f60ec95cefdaa.html

  8. 罗培羽—C语言简单游戏编程教学

    编写许多软件都需要有菜单,那么如果我们使用tc之类的软件来编译程序的话,我们该怎么编写菜单呢?让我们一起来试试吧!第一步:简单例子       我们先来写个最简单的例子:#include<std ...

  9. 关于控制台输出 警告 log4j:WARN No appenders could be found for logger

    新建struts2项目时出现警告 log4j:WARN No appenders could be found for logger 于是上网搜查了解决方案 转自:最爱NBA 在src下面新建file ...

  10. Tarjan算法:求解图的割点与桥(割边)

    简介: 割边和割点的定义仅限于无向图中.我们可以通过定义以蛮力方式求解出无向图的所有割点和割边,但这样的求解方式效率低.Tarjan提出了一种快速求解的方式,通过一次DFS就求解出图中所有的割点和割边 ...