如何正确测量文字高度

  如何正确的计算单行文字高度,这个问题暂不说应用场景,这里单说技术,刚开始我查过好多类似的资料,解释的很单纯也很干脆,但是有个一个问题计算的结果和实际效果差了一个像素,(也许有大佬要问一个像素你都能看出来,厉害了我滴锅,当然一个像素我肯定看不出来,这里如果是一行一个像素,当很多行的时候哪?),这时候我不知道也不确定特么的是计算方式的问题还是哪里的问题。后来我通过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();

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

原文地址:https://www.cnblogs.com/liemng/p/9673361.html

时间: 2024-11-05 11:27:30

如何正确测量文字高度的相关文章

无法修改标注样式中文字高度

有时候标注样式中的文字高度是无法修改的,如下图. 解决方法十分简单,将所选文字样式的默认文字高度设为0.

iOS 计算文字高度

#pragma mark-once 获取文字高度 - (CGSize)sizeWithmaxSize:(CGSize)size anText:(NSString *)anString { NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:anString]; NSMutableParagraphStyle *style = [[NSMutableParag

关于 Android 测量文字宽度的方法

2020-02-04 关键字:测量文本长度.测量字符串长度 最近在写 APK 时遇到了需要获取文本宽度的需求.其实就是要自己写一个算法以实现文本超长自动换行的功能. 在实现这一功能时发现了原来在 Android 中测量文本的长度,或者说宽度可以分两种情况: 1.测量绝对文本的长度 2.测量相对文本的长度 首先必须声明这两个概念是笔者自己定义的,因为我实在找不着更贴切的词句去形容它们了. 什么是绝对文本呢? 就是指那些字号.字体.粗细等属性不受在所运行的硬件设备上的 Android 系统的配置所影

自动适配文字高度

- (UILabel *)titleL{ if(_titleL ==nil){ _titleL = [[UILabel alloc] init]; /**设置文字*/        [_titleL setText:self.myMessModel.content];        [_titleL setTextAlignment:NSTextAlignmentLeft]; //文字颜色        [_titleL setTextColor:[self.Skin getCellTitleC

【代码笔记】获得富文本设置以后的文字高度

一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController @end RootViewController.m #import "RootViewController.h" @interface RootViewController () @end @implementation RootViewContro

IOS计算文字高度

1.计算文字长度 NSString* str = @"你好"; const float kFontSize = 18.f; NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading; CGRect rect = [str boundingRectWithSize:CGSizeMake(MAXFLOAT,MAXFLOAT) options:

获得富文本以后的文字高度

代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self addView]; } #pragma -mark -functions //初始化界面 -(void)addView { //文字 UILabel *dataLabel = [[UILabel alloc] init]; dataLabel.ba

示波器 如何用示波器正确测量电源纹波

由于直流稳压电源一般是由交流电源经整流.滤波.稳压等环节而形成的,这就不可避免地在直流电压中多少带有一些交流分量,这种叠加在直流稳电压上的交流分量称之为纹波. 一.不正确的纹波测试 在ZDS2024 Plus示波器中接入一个3.3V的电源信号,探头档位使用X10档,进行电源纹波的测量,点击[Auto Setup]之后,经过调解水平时基,垂直档位和垂直偏移,可以得到如下图1所示. 图1 不正确的纹波测量方式 从图中可以看出,所测的波形夹杂着许多的噪声和杂波,直流.交流波形混在一起,没办法清晰的观察

android 入门-控件 测量状态栏高度

private ViewTreeObserver viewTreeObserver; /** 获取可見区域高度 **/ WindowManager manager = getWindowManager(); window_width = manager.getDefaultDisplay().getWidth(); window_height = manager.getDefaultDisplay().getHeight(); viewTreeObserver = dragImageView.g