Có nhiều cách khác nhau để đo chiều cao tùy thuộc vào những gì bạn cần.
Nếu bạn đang làm một cái gì đó như chính xác tập trung một lượng nhỏ văn bản cố định, bạn có thể muốn getTextBounds
. Bạn có thể có được hình chữ nhật giới hạn như thế này
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
Như bạn có thể thấy đối với các hình ảnh sau, các chuỗi khác nhau sẽ cho các độ cao khác nhau (hiển thị màu đỏ).
Những độ cao khác nhau này có thể là một bất lợi trong một số tình huống khi bạn chỉ cần một chiều cao không đổi cho dù văn bản là gì. Xem phần tiếp theo.
Bạn có thể tính toán độ cao của phông chữ từ các số liệu phông chữ. Chiều cao luôn giống nhau vì được lấy từ phông chữ, không phải bất kỳ chuỗi văn bản cụ thể nào.
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float height = fm.descent - fm.ascent;
Đường cơ sở là dòng mà văn bản nằm trên. Hậu duệ nói chung là người xa nhất mà một nhân vật sẽ đi dưới dòng và người đi lên nói chung là người xa nhất mà một nhân vật sẽ đi trên dòng. Để có được chiều cao, bạn phải trừ đi vì nó là một giá trị âm. (Đường cơ sở là y=0
và y
giảm dần màn hình.)
Nhìn vào hình ảnh sau đây. Độ cao cho cả hai chuỗi là 234.375
.
Nếu bạn muốn chiều cao dòng thay vì chỉ chiều cao văn bản, bạn có thể làm như sau:
float height = fm.bottom - fm.top + fm.leading; // 265.4297
Đây là bottom
và top
của dòng. Hàng đầu (khoảng cách giữa các dòng) thường bằng không, nhưng dù sao bạn cũng nên thêm nó.
Những hình ảnh trên đến từ dự án này . Bạn có thể chơi xung quanh nó để xem cách thức hoạt động của Font Metrics.
Để đo chiều cao của văn bản nhiều dòng, bạn nên sử dụng a StaticLayout
. Tôi đã nói về nó một số chi tiết trong câu trả lời này , nhưng cách cơ bản để có được chiều cao này là như thế này:
String text = "This is some text. This is some text. This is some text. This is some text. This is some text. This is some text.";
TextPaint myTextPaint = new TextPaint();
myTextPaint.setAntiAlias(true);
myTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
myTextPaint.setColor(0xFF000000);
int width = 200;
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spacingMultiplier = 1;
float spacingAddition = 0;
boolean includePadding = false;
StaticLayout myStaticLayout = new StaticLayout(text, myTextPaint, width, alignment, spacingMultiplier, spacingAddition, includePadding);
float height = myStaticLayout.getHeight();