博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android canvas drawText()文字居中
阅读量:5918 次
发布时间:2019-06-19

本文共 1723 字,大约阅读时间需要 5 分钟。

最近也是在学习自定义控件,以前只自己随便玩了下,一直觉得比较难,正好现在工作轻松,每天闲着就看看书看看帖子学习自定义控件,你还别说自定义控件学起来还是蛮有趣的大笑!!

这里也跟大家分享下我关于drawText()文字居中的方法.

先附上drawText()的方法说明

说实话当时看了这个,我也没明白这个x,y坐标到底表达的啥意思,还一直以为是绘制文字中心的坐标,后来发现这个理解是错误的

要想理解这个首先看张图

像图上这样的文字绘制是相对于基线绘制的,也就是图中的红线,而top+bottom的长度就等于字体高度.即等于|top|+|bottom|绝对值

实际绘制的时候取决于基线上一个点来绘制文字,而这个点有三种分别对应为left,center,right如下图

而drawText()方法中x,y坐标所指的点就是上图基线上三个点中的一个,具体是哪一个根据paint的setTextAlign()方法设置,默认为left

示例代码如下

[java]    
  1. Rect rect = new Rect(100,100,500,500);//画一个矩形  
  2.         Paint rectPaint = new Paint();  
  3.         rectPaint.setColor(Color.BLUE);  
  4.         rectPaint.setStyle(Paint.Style.FILL);  
  5.         canvas.drawRect(rect, rectPaint);  
  6.   
  7.         Paint textPaint = new Paint();  
  8.         textPaint.setColor(Color.WHITE);  
  9.         textPaint.setTextSize(50);  
  10.         textPaint.setStyle(Paint.Style.FILL);  
  11.         //该方法即为设置基线上那个点究竟是left,center,还是right  这里我设置为center  
  12.         textPaint.setTextAlign(Paint.Align.CENTER);  
  13.   
  14.         Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();  
  15.         float top = fontMetrics.top;//为基线到字体上边框的距离,即上图中的top  
  16.         float bottom = fontMetrics.bottom;//为基线到字体下边框的距离,即上图中的bottom  
  17.   
  18.         int baseLineY = (int) (rect.centerY() - top/2 - bottom/2);//基线中间点的y轴计算公式  
  19.   
  20.         canvas.drawText("你好世界",rect.centerX(),baseLineY,textPaint);  

这里有点要注意textPaint.getFontMetrics()这个方法一定要在设置字体大小或者样式等等一系列会影响字体的方法后在调用,不然获取到的top和bottom值不准.

效果如下

正好是在中间的,即证明等式是没有问题的,再来分析这个等式是如何计算的

之所以drawText()方法中x,y指的是基线中间的那个点,是因为setTextAlign(Paint.Align.Center)

那么要想在正中间显示文字,x只要为矩形的中点x坐标即可 x = rect.centerX()

要计算的就是基线中间图上红色点的y坐标了,看图可以发现红色点的y为矩形中点黑色点的y坐标+图中黑色点和红色点之间的距离

矩形y坐标为 rect.centerY()

黑色点和红色点之间的距离为相对于基线的(top+bottom)/2 - bottom

而 top是相对于基线的所以为负数,所以公式为 (-top+bottom)/2 - bottom简化下为-top/2 - bottom/2

所以最后计算为rect.centerY - top/2 - bottom/2. 

到此相信大家应该明白了吧,有什么疑问不对的地方欢迎提出.

    本文转自 一点点征服   博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6690305.html,如需转载请自行联系原作者

你可能感兴趣的文章
苏宁的Node.js实践:不低于Java的渲染性能、安全稳定迭代快
查看>>
Jenkins将致力于提升稳定性、易用性和云原生兼容性
查看>>
从零开始用Python实现k近邻算法(附代码、数据集)
查看>>
Spring注解@Primary的意思
查看>>
行业看点 | 军事专家:量子技术将引起战争基因突变,颠覆未来战争形态
查看>>
Intel和ARM中国市场的芯片之战一触即发
查看>>
青云QingCloud上海1区正式商用:四大升级 连接未来
查看>>
抓住售后服务 抓住新的收入流
查看>>
【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动
查看>>
通过maven-war-plugin插件对war包分环境打包
查看>>
python list排序
查看>>
浅谈mysql主从复制高可用
查看>>
日本经产省将向地方政府提供“物联网”扶持
查看>>
比尔盖茨:机器人抢人类工作应该交税
查看>>
翻译:The Difference Between SOA and Microservices Isn’t Size
查看>>
下一代5G移动网络的安全挑战
查看>>
Facebook正为Internet.org研发毫米波技术
查看>>
人们需要了解的有关闪存缓存的内容
查看>>
亲们,不用再创建变更了
查看>>
微软Windows主管:WP今年不是我们的重点
查看>>