一图以蔽之


需要区分的是这里的top,bottom,ascent,descent,baseline是指字内容的属性,通过getPaint().getFontMetricsInt()来获取得到。和字体内容的外部容器的属性要区分开来。

一个小测试

我自定义了一个MyTextView:

 @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Ln.e("font bottom:" + getPaint().getFontMetricsInt().bottom +"  \ndescent:" + getPaint().getFontMetricsInt().descent +" \nascent:" + getPaint().getFontMetricsInt().ascent +" \ntop:" + getPaint().getFontMetricsInt().top +" \nbaseline:" + getBaseline());/*** TextView组件的属性*/Ln.e("textview bottom:" + getBottom() +" \ntop:" + getTop() +" \nbaseline:" + getBaseline());}

结果是:

font bottom:16
descent:14
ascent:-52
top:-60
baseline:60
textview bottom:76
top:0
baseline:60

可以总结:

  • 字内容的坐标系和TextView组件的坐标系是不一样的
  • 字内容是以其父容器的baseline为原点的。

如果我们想自己实现一个TextView,并且实现字内容能够垂直居中,我们在画布中绘制文本的时候,会调用Canvas.drawText(String text, float x, float y, Paint paint)这个方法,其中y的坐标就是上图中baseline的y坐标,所以,如果我们只是简单地把drawText方法中的y设置为控件高度的1/2是不准确的。实际上:

yBaseline = Height/2 + (fontbottom-fontTop)/2 - fontBotton

看,这个时候就体现出以baseline为原点的好处了,因为我们在drawText的时候,都是需要输入字内容的baseline 的y坐标的。而不是bottom.

【Android UI】TextView的垂直方向概念之top,bottom,ascent,descent,baseline相关推荐

  1. 【Android UI】图片 + 文字展示by SpannableStringBuilder

    起源 图片和文字混合展示,比如这么个需求,需要在每段文字的左边要有一个小圆点,(小圆点符号在android系统中并不支持). 先用TextView的setDrawableLeft, 嗯,达到要求,那么 ...

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

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

  3. Android TextView 带背景的文字垂直方向显示(ems属性)

    工具:Android Studio 在项目中有个这个需求:要求文字带背景,且文字是垂直方向显示的,竖着排,如图1. 图1  但是当我满怀欣喜地写入了这段代码之后: <TextView andro ...

  4. android 水平方向瀑布流,Android RecyclerView(瀑布流)水平/垂直方向分割线

     Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...

  5. Android RecyclerViewSwipeDismiss:水平、垂直方向的拖曳删除item

     Android RecyclerViewSwipeDismiss:水平.垂直方向的拖曳删除item RecyclerViewSwipeDismiss是一种支持RecyclerView的水平.垂直 ...

  6. android 自定义textview 垂直滚动,Android中TextView如何实现水平和垂直滚动

    一.只想让TextView显示一行,但是文字超过TextView的长度怎么办? 在开头显示省略号 android:singleLine="true" android:ellipsi ...

  7. 如何实现以上垂直方向上两个TextView内文字左右对齐

    会员号 昵    称 如何实现以上垂直方向上两个TextView内文字左右对齐呢? 网上给出了各种,什么加空格,加标点,证明没有靠谱的! 最后想到一个最简单的方式: 1. 将所有文字字符串都增加到最大 ...

  8. GitHub标星5.6K,2020腾讯又一力作开源的Android UI框架——QMUI Android

    各位同学,早上好,我是你们的老朋友D_clock爱吃葱花,前些天忙着发版本,最近也在看各种各样的新知识,有好多东西想写啊啊啊啊啊.嗯,先冷静捋一下,卖个关子.扯回正题,今天继续为大家推荐一个Githu ...

  9. Android UI设计经验分享,掌握设计技巧,让你的应用独树一帜

    Android UI渲染是指Android应用程序中的用户界面如何被绘制.Android UI渲染很重要,因为渲染过程直接影响应用程序的性能和用户体验. 当用户在Android应用程序中进行交互时,应 ...

最新文章

  1. 为什么用了索引之后,查询就会变快?
  2. Kotlin教程(九)泛型
  3. 怎样Selenium IDE选择combo box中值
  4. flask教程之创建第一个flask应用
  5. 今日arXiv精选 | 13篇EMNLP 2021最新论文
  6. Java关于文件上传的一个例子
  7. java异常类型 数组越界_java数组中的异常类型整理
  8. 怎么使用7zip进行分批压缩_怎么使用钢结构抛丸机对钢结构进行除锈?
  9. SQLSERVER EXCEPT运算符=ORACLE MINUS
  10. 转载---Adaboost学习记录
  11. linux启动盘制作工具_开源免费的国产多系统启动盘制作工具:Ventoy
  12. 图像坐标球面投影_比较常用的坐标几种投影
  13. MySQL:日期函数、时间函数总结(MySQL 5.X)
  14. html超链接块状,超链接伪类
  15. Android人脸支付功能,OPPO Find X成为首款支持微信人脸支付的安卓手机
  16. 用python画一个机器猫歌词_用Python语言模型和LSTM做一个Drake饶舌歌词生成器
  17. 在ENSP中配置DHCP服务器
  18. VIO学习笔记(二)—— IMU 传感器
  19. python 证书-python+证书
  20. java中使用Jedis操作Redis实例

热门文章

  1. 【leetcode】97. Interleaving String
  2. 实现Spark集群部署 这些公司都经历了什么?
  3. Advanced Auto Layout:Programmatically Creating Constraints
  4. linux下的module_param()解释【转】
  5. Oracle 11g新特性之--只读表(read only table)
  6. Ubuntu 修改时区和时间
  7. [linux基础学习]文件和目录属性
  8. 结合JDK源码看设计模式——策略模式
  9. 模拟ssh的远程网络传输
  10. Docker:搭建RabbitMQ集群