如何正确测量文字高度

Posted liemng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何正确测量文字高度相关的知识,希望对你有一定的参考价值。

  如何正确的计算单行文字高度,这个问题暂不说应用场景,这里单说技术,刚开始我查过好多类似的资料,解释的很单纯也很干脆,但是有个一个问题计算的结果和实际效果差了一个像素,(也许有大佬要问一个像素你都能看出来,厉害了我滴锅,当然一个像素我肯定看不出来,这里如果是一行一个像素,当很多行的时候哪?),这时候我不知道也不确定特么的是计算方式的问题还是哪里的问题。后来我通过TextView来进行了一次类似的测量,发现和之前的方式结果不一样,但是结果却是我希望的结果,买噶扥,我滴天。那么问题来了,是计算方法的问题还是特么的Google的问题。

  这个是个问题?

  带着这个问题,我首先想到是Google源码是如何测试TextView的高度。可以深入到源码中去查看,这里暂不说源码,大家自己手动看下即可,这里原因最主要就是Google进行测量的时候不会使用小数去测量和布局(这里句话是重点)。下边看我正确的测试代码

 

1         FragmentActivity activity = getActivity();
2         Paint paint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
3         float typeValue = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, activity.getResources().getDisplayMetrics());
4         paint.setTextSize(typeValue);
5         Paint.FontMetrics fontMetrics = paint.getFontMetrics();
6         int bottom = (int) Math.ceil(fontMetrics.bottom);
7         int top = (int) Math.floor(fontMetrics.top);
8         int textHeight = bottom - top;

 

  这里需要说的就是Math这个类,主要就是把对应的小数转换成整数,而且对于正小数皆是向上取整数,负数小数向下取整。这样虽然算出的高度要比实际的高度要大,但是却和Google中TextView的高度计算一样。至于如果取舍,大家可以根据需要进行选择。

 

  这里还有另一个方法,算是比较官方吧,android自己来计算的一种方式

 

        TextView view = new TextView(activity);
        view.setTextSize(12);
        view.setText("测试");
        int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        view.measure(widthMeasureSpec, heightMeasureSpec);
        int textHeight = view.getMeasuredHeight();

 

  如上两种方式皆可实现单行高度测量,至于如何选择看自身需要。

 

以上是关于如何正确测量文字高度的主要内容,如果未能解决你的问题,请参考以下文章

如何测量代码片段的调用次数和经过时间

如何使用android相机测量物体的宽度和高度?

为啥通过 AJAX 无限滚动加载的内容的高度在加载后没有正确测量?

Android:如何测量 ListView 的总高度 [重复]

0015 行高那些事:line-height

jQ如何获得网页实际高度?