2013-08-15 48 views
8

Hiện tại tôi đang sử dụng paintObject.measureText(textCopy.substring(0,i)) trong khi lặp qua bản sao văn bản của TextView. Ví dụ: measureText("abc".substring(0,1)) sẽ cho tôi toạ độ x tương đối của 'b'. Số tọa độ y tôi nhận được từ layout.getLineTop(). Tính năng này hoạt động nhưng không chính xác cho các tọa độ x cho các đối tượng không monospaced phông chữ. Tôi có thể hiệu chỉnh một chút, nhưng trên mỗi thiết bị, nó hoạt động khác nhau.Tìm tọa độ chính xác của một ký tự đơn bên trong TextView

Giải pháp tốt nhất tôi có thể nghĩ là ghi đè lên lớp có trách nhiệm vẽ TextView trên màn hình và hy vọng có được tọa độ của từng ký tự được vẽ ra màn hình.

Có ai biết lớp tôi cần ghi đè để thực hiện việc này không? Hoặc có thể một số giải pháp sáng tạo khác?

+0

Văn bản được cho là có chứa bất kỳ đánh dấu nào (như một số thẻ html) không? Nếu không, sau đó bạn có thể chỉ cần ghi đè lên "onDraw()" của TextView và vẽ văn bản như bạn vui lòng. –

+0

Nó có thể chứa văn bản được mở rộng. – Igor

+0

Cũng làm phức tạp mọi thứ một chút, trong "onDraw()" bạn sẽ phải render mỗi char dựa trên bất kỳ khoảng thời gian nào nó thuộc về, như in đậm hoặc in nghiêng bằng cách cập nhật 'Paint' đang được sử dụng để vẽ. –

Trả lời

7

Vâng, có vẻ như là lỗi của Paint.measureText() hoặc lớp sâu hơn khác. Nhưng tôi có CUỐI CÙNG tìm thấy một con đường xung quanh nó:

layout.getPrimaryHorizontal(int offset) 

này là rất dễ dàng. Bạn chỉ cần lặp qua bố cục bằng cách sử dụng độ dài của văn bản mà nó sử dụng.

Nó sẽ trả về x của ký tự REGARDLESS của vị trí đường kẻ. Vì vậy, dòng tôi vẫn nhận được từ layout.getLineTop(). Nhân tiện, nếu bạn đang sử dụng layout.getLineTop(), lưu ý rằng có một số hành vi lạ, có thể là một lỗi. Tôi đã gửi báo cáo lỗi here.

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