2012-02-20 31 views
8

Tôi hiện đang làm việc để hiển thị bitmap, sau đó tôi muốn gửi tới máy in di động. Tuy nhiên, tôi đang đấu tranh với đo chiều cao của văn bản của tôi, vì vậy tôi có thể thăng tiến vị trí y một cách thích hợp.Android: Đo chiều cao văn bản trên Canvas

cấu hình bitmap/vải/sơn cơ bản của tôi là thế này (Font Size là 16 và kích thước của bitmap là 200x400 (chiều rộng x chiều cao):

public MyRenderer() { 
    // Initialize bitmap 
    bitmap = Bitmap.createBitmap(200, 400, Bitmap.Config.ARGB_8888); 

    // Initialize canvas 
    canvas = new Canvas(bitmap); 

    // Initialize brush (Paint instance) 
    brush = new Paint(); 
    brush.setTextSize(16); 
    brush.setTypeface(Typeface.SANS_SERIF); 
    brush.setColor(Color.BLACK); 
    brush.setStyle(Paint.Style.FILL); 
    brush.setAntiAlias(true); 
    brush.setTextAlign(Align.LEFT); 
} 

Cho đến nay rất tốt, bây giờ những gì tôi muốn Do là: Nếu tôi sử dụng phương thức drawText của Paint, tôi cần cung cấp tọa độ x và y.Đối với x đó là zero (giả sử văn bản được căn trái) nhưng đối với y, tôi phải tính chiều cao của mỗi văn bản tôi in và thêm nó lên, vì vậy tôi có thể theo dõi vị trí y hiện tại của tôi

Và đây là nơi nó được lẻ: Tôi đang sử dụng phương pháp sau để xác định chiều cao của văn bản (sử dụng Pai nt phản đối mà tôi khởi tạo trước đó - nó được gọi là "bàn chải"):

public int measureHeight(String text) { 
    Rect result = new Rect(); 
    // Measure the text rectangle to get the height 
    brush.getTextBounds(text, 0, text.length(), result); 
    return result.height(); 
} 

Các phương pháp trên sẽ trả về giá trị sau cho văn bản sau đây:

  1. "Hello World" trả về một chiều cao của
  2. "Một thể hiện máy ảnh có thể được sử dụng để tính toán chuyển đổi 3D và tạo ma trận. "trả về chiều cao
  3. " Giới thiệu thiết kế Android: Nơi để tìm hiểu về nguyên tắc, khối xây dựng và mẫu để tạo giao diện người dùng Android đẳng cấp thế giới. Cho dù bạn là một người chuyên nghiệp về giao diện người dùng hay nhà phát triển đóng vai trò đó, những tài liệu này chỉ cho bạn cách đưa ra quyết định thiết kế tốt, lớn và nhỏ. "trả về một chiều cao của

Nó làm cho ý nghĩa với tôi, đó là số 2 và 3 trở lại chiều cao lớn hơn số 1 nhưng nếu một dòng có chiều cao là 12 (là số một không) - nó không có ý nghĩa gì, rằng nhiều dòng có chiều cao là 16?

Tôi có thiếu gì đó ở đây không? Có một phương pháp thuận tiện để đo chiều rộng của văn bản (sử dụng một thể hiện của paint và gọi measureText ("myText") hoạt động hoàn hảo, tuy nhiên tôi khá thua lỗ, khi nói đến chiều cao, như các kết quả được đưa ra ở trên không có ý nghĩa gì với tôi.EDIT

Tôi biết, rằng getTextBounds lẽ không có tính năng tự động gói văn bản đa rợp bóng, và đó là ok, tôi đã viết một phương pháp cho văn bản chia tách, nhưng ngay cả khi nó chỉ đo một dòng, trên cho giá trị độ dài vẫn có vẻ khó xảy ra.

Trả lời

16

Tôi nghĩ rằng đó là vì "p" trong "tính toán" mở rộng bên dưới đường cơ sở trong khi "Hello World" chỉ chứa các chữ cái phía trên đường cơ sở.

Vì khoảng cách đường truyền không nên phụ thuộc vào những chữ cái cụ thể mà văn bản của bạn xảy ra bao gồm bạn có thể đang tìm kiếm Paint.FontMetrics có thể lấy thông qua Paint.getFontMetrics(). Tính toán descent - ascent + leading để nhận khoảng cách đường cơ sở được đề xuất (vì phần trăm có giá trị âm).

+0

tôi tính toán khoảng cách ban đầu (theo tính toán của bạn) cho những ba trên văn bản nhất định, nó luôn luôn trả 19. Would điều đó có nghĩa là, nếu tôi lấy 19 có chiều cao, vẫn còn đủ không gian cho dòng tiếp theo để không trùng với dòng hiện tại? Cảm ơn bạn rất nhiều trước! – AgentKnopf

+0

Đó là một đặc tính của phông chữ, bạn không phải tính toán nhiều lần cho các văn bản khác nhau. Bạn muốn khoảng cách luôn giống nhau, bất kể ký tự của bạn bao gồm những gì. Và có, các dòng sẽ không chồng lên nhau. – devconsole

+0

Cảm ơn bạn rất nhiều - đó là những gì tôi đã làm và hiển thị bitmap của tôi hoạt động tốt ngay bây giờ :). Tôi khởi tạo "chiều cao dòng" một lần trong hàm tạo của MyRenderer. – AgentKnopf

4

Có một lỗi nhỏ trong câu trả lời được chấp nhận. Nếu bạn muốn văn bản chiều cao, bạn nên sử dụng

Paint.FontMetrics fm = mTextPaint.getFontMetrics(); 
float textHeight = fm.descent - fm.ascent; 

Và nếu bạn muốn dòng chiều cao, bạn nên sử dụng

float lineHeight = fm.bottom - fm.top + fm.leading; 

Dẫn đầu là tùy chọn khoảng cách nối chuyến, vì vậy nếu bạn cần nhận được dòng cao, bạn có thể bao gồm nó. Nhưng nếu bạn chỉ muốn chiều cao văn bản, sau đó bạn có thể để nó đi.

Note

  • Tôi chưa bao giờ thực sự nhìn thấy leading được bất cứ điều gì khác hơn 0, và như xa như tôi có thể nói nó thậm chí dường như bị bỏ qua trong TextView source code (và nó liên quan đến Layout, StaticLayout, v.v.) Nêu tôi sai vui long chân chỉnh tôi. Vì vậy, nó có lẽ là an toàn nó để lại nó ra khỏi dòng cao, nhưng tôi không hoàn toàn chắc chắn về điều đó.

Xem thêm

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