2013-03-13 12 views
7

Có một phương thức trong lớp Paint: Paint.getTextBounds() trả về Rect bị chiếm bởi một số văn bản. Nhưng theo câu trả lời this nó trả về một cái gì đó khác nhau sau đó chiều rộng/chiều cao của TextView.Làm thế nào để nhanh chóng có được chiều rộng và chiều cao của TextView sử dụng Paint.getTextBounds()?

Q1: Có cách nào để có chiều rộng và chiều cao của TextView sử dụng Rect được trả lại bởi Paint.getTextBounds() không?

Lưu ý, tôi cần biết chiều rộng/chiều cao chính xác. Tôi sẽ rất vui khi biết giới hạn trên của rect với lỗi có thể xảy ra khoảng 2-3%, nhưng nó KHÔNG phải lớn hơn (và phải hoạt động cho bất kỳ điện thoại nào không phụ thuộc vào độ phân giải màn hình và mật độ điểm ảnh) sau đó TextView bounds

Q2: Có phương pháp NHANH nào khác để xác định chiều rộng và chiều cao của một số văn bản với textSize được chỉ định không?

Tôi biết, chiều rộng có thể được xác định bởi Paint.measureText(), nhưng điều này không trả về chiều cao. Chiều cao có thể được xác định bằng cách tạo mới StaticLayout với văn bản và sau đó gọi số StaticLayout.getHeight(), nhưng điều này quá chậm. Tôi cần một cái gì đó nhanh hơn.


Các nền cho tất cả những điều này đang thực hiện AutoFitTextView mà sẽ automaticaly phù hợp văn bản bên trong giới hạn của nó bằng cách cập nhật mới hoặc xuống rộng kích thước văn bản, và nó nên làm điều này một cách nhanh chóng, vì sẽ có nhiều như vậy AutoFitTextView s thay đổi động rất nhanh.

Trả lời

9

Tìm thấy một phương pháp đơn giản và chậm không xác định văn bản chiều rộng/chiều cao được vẽ bằng cụ Paint mà không sử dụng StaticLayout.

public int getTextWidth(String text, Paint paint) { 
    Rect bounds = new Rect(); 
    paint.getTextBounds(text, 0, text.length(), bounds); 
    int width = bounds.left + bounds.width(); 
    return width; 
} 

public int getTextHeight(String text, Paint paint) { 
    Rect bounds = new Rect(); 
    paint.getTextBounds(text, 0, text.length(), bounds); 
    int height = bounds.bottom + bounds.height(); 
    return height; 
} 

Các mô tả đơn giản ngắn lừa: Paint.getTextBounds(String text, int start, int end, Rect bounds) lợi nhuận Rect mà không bắt đầu từ (0,0). Tức là, để có chiều rộng văn bản thực tế sẽ được đặt bằng cách gọi Canvas.drawText(String text, float x, float y, Paint paint) với cùng một đối tượngPaint từ getTextBounds() bạn nên thêm vị trí bên trái của Rect.

Lưu ý điều này bounds.left - đây là vấn đề chính.

Bằng cách này, bạn sẽ nhận được cùng chiều rộng của văn bản mà bạn sẽ nhận được bằng cách sử dụng Canvas.drawText().


Giải thích chi tiết hơn được đưa ra trong câu trả lời this.

+1

Hai phương pháp này có được coi là hoạt động đúng không? Bởi vì "end" không được định nghĩa, và tham số thứ tư trong lời gọi getTextBounds là "Rect bounds". Không nên dòng khá looke như: "paint.getTextBounds (văn bản, 0, text.length(), giới hạn);" – ghost23

+0

vâng, đây là lỗi đánh máy :) – Prizoff

+0

Và nguyên nhân, hai phương pháp này nên được kết hợp thành một. Ngoài ra, lưu ý rằng 'bounds.left + bounds.width()' thực sự giống với 'bounds.right' – Prizoff

1

Với java tôi đã sử dụng lớp FontMetrics.

Font f= new Font("Arial", Font.BOLD, 16); 
FontMetrics metric = getFontMetrics(f); 


metric.stringWidth("the text I want to measure"); 
+0

Tôi thấy rằng FontMetrics có thể được sử dụng để xác định giới hạn trên/dưới của các ký tự phông chữ ... nhưng 'metrica' trong mã của bạn là gì? – Prizoff

+0

nó chỉ là một erratum –

+0

Hm, có vẻ như lớp 'FontMetrics' duy nhất trong Android là' Paint.FontMetrics', và nó không có phương thức 'stringWidth()', chỉ có các thuộc tính 'top' /' bottom'. .. Vì vậy, nó có thể được sử dụng (ví dụ 'Paint.getFontMetrics(). Top') để xác định chiều cao của văn bản (và nó sẽ đếm chiều cao char tối đa cho tất cả các phông chữ), nhưng không phải chiều rộng. Dù sao, cảm ơn vì đã đề cập đến lớp học này! – Prizoff