关于自定义TextView的测量问题
来源:互联网 发布:怎么联系淘宝店铺客服 编辑:程序博客网 时间:2024/06/05 13:34
首先推荐一个鸿洋大神的一个关于自定义字体的博客:http://blog.csdn.net/lmj623565791/article/details/44098729
本文的内容都是在观看博客时的一些总结,所以若下文有看不懂的请结合上面博客。
——————————我是萌萌的分割线———————————
首先我们看一下measureText中的处理:
mTextWidth = (int) mPaint.measureText(mText); Paint.FontMetrics fm = mPaint.getFontMetrics(); mTextHeight = (int) Math.ceil(fm.descent - fm.top); mPaint.getTextBounds(mText, 0, mText.length(), mTextBound); mTextHeight = mTextBound.height();
其中关于文字的宽度我们是根据measureText方法测量得到的,查看measureText的源码在注释中我们就能发现,这个方法是Return the width of the text.
下面的得到文字的高度的时候我们就发现没有直接得到高度的方法,一个简单的办法在Paint.java中搜索Return the height为空。这里我们就要分析一下getFontMetrics这个方法了。
要点如下:
基准点是baseline
Ascent是baseline之上至字符最高处的距离
Descent是baseline之下至字符最低处的距离
Leading文档说的很含糊,其实是上一行字符的descent到下一行的ascent之间的距离
Top指的是指的是最高字符到baseline的值,即ascent的最大值
同上,bottom指的是最下字符到baseline的值,即descent的最大值
看到这里我们就发现其实大神的代码里有个错误:mTextHeight = (int) Math.ceil(fm.descent - fm.top);
这句话明显不能得到正确的高度。
但是下面就得到了纠正 mPaint.getTextBounds(mText, 0, mText.length(), mTextBound);
mTextHeight = mTextBound.height();
其实可以看到这里完全覆盖了上面的定义,所以上面那句可能是大神为了启发我们故意留的吧。
这里我们对getTextBounds又陌生了。这里再看一幅图:
这是关于drawText方法的一个描述,其中的红色框架就代表了getTextBounds方法获得的Rect的大小,这是文字的实际所占用的区域的大小,所以我们可以得到文字所需要的实际高度。
但是我们又发现了drawText方法指向的是一个蓝色的方框,代表在实际布局中TextView所占用的实际面积的大小。同时告诉了我们绘制时的起点是在基准线BaseLine那里。所以我们在调用drawText方法时要注意起始的位置
canvas.drawText(mText, mTextStartX,getMeasuredHeight() / 2- ((mPaint.descent() + mPaint.ascent()) / 2), mPaint);
这里为什么这么写,大家可以参考我上面说的计算方法并参考博客中的实际位置看一下。
其中参考了:http://blog.51cto.com/mikewang/871765
http://blog.csdn.net/linghu_java/article/details/46404081
- 关于自定义TextView的测量问题
- Android 关于自定义TextView的测量
- TextView的高度测量问题。
- 关于自定义dialog中textview的显示的问题
- 关于MeasureString测量字体的长度问题
- 关于移动测量姿态问题的思考
- 自定义View的测量
- 自定义TextView,解决布局乱的问题
- 关于View的测量
- 关于单片机测量信号频率的精度问题
- 关于限制TextView的输入问题
- 关于TextView排版混乱的问题
- 关于selector对TextView不起作用的问题
- 关于textview显示特殊符号居中的问题
- 自定义ViewGroup的测量规则
- 探究自定义View的测量
- 自定义Dialog的测量优化
- 自定义控件测量的深究
- c++基础概念之深浅拷贝
- [mongdb]安装mongodb和将mongdb设置为windows服务
- 2012-ImageNet数据集冠军AlexNet论文英文原文及AlexNet分析
- 【深度学习框架Caffe学习与应用】第四课 Caffe可视化工具
- 【BZOJ3294】放棋子(CQOI2011)-DP+组合数学
- 关于自定义TextView的测量问题
- C++中不应该返回局部变量的地址
- HTTP协议
- 图解机器学习
- 9.1数字三角形(记忆化搜索与递推)
- 论文结果难复现?本文教你完美实现深度强化学习算法DQN
- Android事件分发机制
- StackOverFlow提问的艺术
- PC端连接Android设备进行adb调试