要想理解这个首先看张图

image

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

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

image

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

示例代码如下

Rect rect = new Rect(100,100,500,500);//画一个矩形

Paint rectPaint = new Paint();

rectPaint.setColor(Color.BLUE);

rectPaint.setStyle(Paint.Style.FILL);

canvas.drawRect(rect, rectPaint);

Paint textPaint = new Paint();

textPaint.setColor(Color.WHITE);

textPaint.setTextSize(50);

textPaint.setStyle(Paint.Style.FILL);

//该方法即为设置基线上那个点究竟是left,center,还是right 这里我设置为center

textPaint.setTextAlign(Paint.Align.CENTER);

Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();

float top = fontMetrics.top;//为基线到字体上边框的距离,即上图中的top

float bottom = fontMetrics.bottom;//为基线到字体下边框的距离,即上图中的bottom

int baseLineY = (int) (rect.centerY() - top/2 - bottom/2);//基线中间点的y轴计算公式

canvas.drawText("你好世界",rect.centerX(),baseLineY,textPaint);

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

效果如下

image

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

image

之所以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.

android textview基线,关于Textview基准线的计算相关推荐

  1. android textview基线,Textview画文字基线的问题

    有些小伙伴在自定义View的时候需要画文字,当画文字的基线的时候出现不少问题, 调用 canvas.drawText(text, x , y , paint); 这里的text字体,x开始的位置,y基 ...

  2. Android 第五章 TextView

    android:id="@+id/xx"控件标识.标签.ID android:layout_margin="10dp" 子控件与父控件之间距离10dp andr ...

  3. Android中实现为TextView添加多个可点击的文本

    这篇文章主要介绍了Android中实现为TextView添加多个可点击的文本,可实现类似Android社交软件显示点赞用户并通过用户名称进入该用户主页的功能,是非常实用的技巧,需要的朋友可以参考下.具 ...

  4. android 保存textview,为什么没有TextView(带ID)会自动保存它的状态?

    我的理解是所有具有ID的标准视图都应该自动保存它们的状态,并且在尝试这个例子时我发现它非常令人困惑. 我只有1个活动和主要布局如下所示. 当我通过单击按钮更改TextView的文本,然后旋转屏幕时,T ...

  5. 【Android 应用开发】Android UI 设计之 TextView EditText 组件属性方法最详细解析

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...

  6. android 多个textview,Android:多个textview像单个文本

    需要格式化几个textview像一个又一个独特的文本块,有没有办法实现这个?Android:多个textview像单个文本 这样 __________________________ | | | | ...

  7. Android之——自己定义TextView

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47082241 在这一篇博文中,将向大家介绍怎样以最简单的方式,来自己定义Andro ...

  8. Android利用SpannableStringBuilder设置TextView中部分文字的颜色...

    原文:android - SpannableString或SpannableStringBuilder以及string.xml文件中的整型和string型代替 背景介绍 在开发应用过程中经常会遇到显示 ...

  9. Android自定义控件之拓展TextView(ExpandTextView)

    LZ-Says:给大家推荐一个网站,有兴趣可以查阅,想为大家贡献一点自己的力量也可以投稿,老大审核通过会发表,更好的帮助有需要的人~欢迎大家踊跃投稿~地址如下: http://www.123si.or ...

最新文章

  1. Entity Framework Core 2.0的新特性
  2. angular $observe() 和$watch的区别
  3. 从官网下载的python包如何使用-如何使用Python从需要登录信息的网站下载文件?...
  4. SecureCRT 6.7 vim高亮
  5. 从 0 到 1 实现浏览器端沙盒运行环境
  6. 解读ASP.NET 5 MVC6系列(9):日志框架
  7. jmeter持续集成测试中mongodb版本问题
  8. 基于linux的智能小车_商汤首款原创机器人SenseRover X自动驾驶小车斩获Red Dot Award...
  9. 因2800万美元太贵 演员汤姆·汉克斯拒绝贝佐斯上太空邀请
  10. L2-023 图着色问题-PAT团体程序设计天梯赛GPLT
  11. Silverlight5 RC调用Win32API
  12. 测试管理中的一个问题—功能点覆盖还是功能测试点覆盖
  13. 如何卸载红蜘蛛多媒体网络教室软件
  14. 创e下载园7edown.com(坑爹流氓网站大揭秘)
  15. 4款idea主题,非常的炫酷
  16. 学习java哪个网课最好_学习Java的最佳方法
  17. 利用XML文件以及集合方法设计简单超市管理系统的Java程序
  18. 滤波器时间域与空间域幅频特性matlab绘图方法
  19. 米斯特白帽培训讲义(v2)漏洞篇 弱口令、爆破、遍历
  20. Anaconda的卸载及安装(图文详解)

热门文章

  1. 学校计算机社团目标,电脑社团活动计划
  2. 人生观,世界观,价值观树立的方式
  3. Web前端工程师知识体系大全,Web前端入门基础体系
  4. 什么是范数(norm)?以及L1,L2范数的简单介绍
  5. 电流检测电路公式推导
  6. 【书单】程序设计好书推荐
  7. SEO零基础入门教程(外链的发布和软文编写)
  8. pymysql数据库的水果店销售系统之管理员端1.0
  9. 【诗词】曹雪芹:红豆词
  10. unable to resolve module