21

Tôi đang tìm phương pháp trong Android sẽ lấy đầu vào (văn bản, text_font_size, device_width) và dựa trên các tính toán này, nó sẽ trả về bao nhiêu chiều cao sẽ được yêu cầu để hiển thị văn bản cụ thể?Cách Đo Chiều cao TextView Dựa trên Chiều rộng và Kích thước Phông chữ của Thiết bị?

Tôi đang đặt thời lượng hiển thị văn bản/chế độ xem web dựa trên nội dung của anh ấy, tôi biết về nội dung dọc nhưng tôi không thể sử dụng trong trường hợp của mình do một số vấn đề về độ cao tối thiểu của chế độ xem web.

Vì vậy, tôi đang cố gắng tính toán chiều cao và dựa trên đó tôi đang thiết lập chiều cao xem.

Tôi đã thử với những cách sau đây

Paint paint = new Paint(); 
paint.setTextSize(text.length()); 
Rect bounds = new Rect(); 
paint.getTextBounds(text, 0, 1, bounds); 
mTextViewHeight= bounds.height(); 

Vì vậy, đầu ra là

1) "Hello World" trả về một chiều cao của 13 cho phông chữ 15

2) "Phiên bản mới nhất của Jelly Bean ở đây, với tối ưu hóa hiệu suất "trả về độ cao 16 cho phông chữ 15

Sau đó, tôi đã thử với

Paint paint = new Paint(); 
paint.setTextSize(15); 
paint.setTypeface(Typeface.SANS_SERIF); 
paint.setColor(Color.BLACK); 

Rect bounds = new Rect(); 
paint.getTextBounds(text, 0, text.length(), result); 

Paint.FontMetrics metrics = brush.getFontMetrics(); 
int totalHeight = (int) (metrics.descent - metrics.ascent + metrics.leading); 

Vì vậy, đầu ra là

1) "Hello World" trả về một chiều cao của 17 cho phông chữ 15

2) "Phiên bản mới nhất của Jelly Bean là ở đây, với optimisations hiệu suất" trả về chiều cao 17 cho phông chữ 15

nếu tôi đặt các giá trị này cho chế độ xem của mình, sau đó cắt bớt một số văn bản, nó không hiển thị tất cả nội dung.

Một lần nữa có vẻ OK trên một số bảng vì nó có chiều rộng lớn nhưng không có trên điện thoại.

Có cách nào để tính chiều cao dựa trên nội dung không?

Trả lời

44
public static int getHeight(Context context, String text, int textSize, int deviceWidth) { 
    TextView textView = new TextView(context); 
    textView.setText(text); 
    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); 
    int widthMeasureSpec = MeasureSpec.makeMeasureSpec(deviceWidth, MeasureSpec.AT_MOST); 
    int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 
    textView.measure(widthMeasureSpec, heightMeasureSpec); 
    return textView.getMeasuredHeight(); 
} 

Nếu textSize không được đưa ra trong pixel, thay đổi paramter đầu tiên của setTextSize().

+0

Câu trả lời thú vị. – Noundla

+0

kích thước văn bản là gì? –

7

Paint.getTextBounds() không trả về những gì bạn mong đợi. Chi tiết là here.

Thay vào đó, bạn có thể thử cách này:

int mMeasuredHeight = (new StaticLayout(mMeasuredText, mPaint, targetWidth, Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true)).getHeight(); 
+0

Cảm ơn. Đây là những gì nên được sử dụng để lắp ráp lại độ cao TextView bản địa khi vẽ văn bản. –

+0

Còn phông chữ tùy chỉnh thì sao? –

5

Tôi đã có một phương pháp dễ dàng để biết chiều cao thực sự của một dòng trước khi được sơn, tôi không biết nếu điều này giúp bạn guys, nhưng giải pháp của tôi để có được chiều cao của một dòng nó không phụ thuộc vào chiều cao của bố cục, chỉ lấy số liệu phông chữ như thế này:

myTextView.getPaint().getFontMetrics().bottom - myTextView.getPaint().getFontMetrics().top) 

với điều đó chúng tôi nhận được chiều cao thực sự mà các phông chữ sẽ lấy từ TextView được Sơn. Điều này không cung cấp cho bạn một int, nhưng bạn có thể làm cho một Math.round để có được một giá trị gần.

Các vấn đề liên quan