2012-05-15 15 views
25

Tôi đang sử dụng Canvas để tạo Bản vẽ với một số nền và một số văn bản. Các drawable được sử dụng như một hợp chất drawable bên trong một EditText.Android canvas drawText y-vị trí của văn bản

Văn bản được vẽ qua drawText() trên canvas, nhưng tôi gặp sự cố với vị trí y của văn bản được vẽ trong một số trường hợp. Trong những trường hợp đó, các phần của một số ký tự bị cắt bỏ (xem liên kết hình ảnh).

Nhân vật không vấn đề định vị:

http://i50.tinypic.com/zkpu1l.jpg

Nhân vật với vấn đề định vị, văn bản có chứa 'g', 'j', 'q', v.v .:

http://i45.tinypic.com/vrqxja.jpg

Bạn có thể tìm đoạn mã để tạo lại sự cố bên dưới.

Có chuyên gia nào biết cách xác định độ lệch thích hợp cho vị trí y không?

public void writeTestBitmap(String text, String fileName) { 
    // font size 
    float fontSize = new EditText(this.getContext()).getTextSize(); 
    fontSize+=fontSize*0.2f; 
    // paint to write text with 
    Paint paint = new Paint(); 
    paint.setStyle(Style.FILL); 
    paint.setColor(Color.DKGRAY); 
    paint.setAntiAlias(true); 
    paint.setTypeface(Typeface.SERIF); 
    paint.setTextSize((int)fontSize); 
    // min. rect of text 
    Rect textBounds = new Rect(); 
    paint.getTextBounds(text, 0, text.length(), textBounds); 
    // create bitmap for text 
    Bitmap bm = Bitmap.createBitmap(textBounds.width(), textBounds.height(), Bitmap.Config.ARGB_8888); 
    // canvas 
    Canvas canvas = new Canvas(bm); 
    canvas.drawARGB(255, 0, 255, 0);// for visualization 
    // y = ? 
    canvas.drawText(text, 0, textBounds.height(), paint); 

    try { 
     FileOutputStream out = new FileOutputStream(fileName); 
     bm.compress(Bitmap.CompressFormat.JPEG, 100, out); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Trả lời

25

tôi nghĩ rằng nó có thể là một sai lầm khi cho rằng textBounds.bottom = 0. Đối với những ký tự giảm dần, các bộ phận dưới cùng của những nhân vật có lẽ là dưới 0 (có nghĩa là textBounds.bottom> 0). Bạn có thể muốn một cái gì đó như:

canvas.drawText(text, 0, textBounds.top, paint); //instead of textBounds.height()

Nếu textBounds của bạn là từ 5 đến -5, và bạn vẽ văn bản tại y = chiều cao (10), sau đó bạn sẽ chỉ nhìn thấy nửa trên của văn bản .

+13

Cảm ơn bạn đã chỉ cho tôi đúng hướng. canvas.drawText (văn bản, 0, textBounds.height() - textBounds.bottom, sơn); là giải pháp – darksaga

10

Tôi tin rằng nếu bạn muốn vẽ văn bản gần góc trên bên trái, bạn nên làm điều này:

canvas.drawText(text, -textBounds.left, -textBounds.top, paint); 

Và bạn có thể di chuyển xung quanh các văn bản bằng cách tổng hợp số tiền mong muốn của dịch chuyển tới hai tọa độ:

canvas.drawText(text, -textBounds.left + yourX, -textBounds.top + yourY, paint); 

Lý do tại sao công trình này (ít nhất là đối với tôi) là getTextBounds() cho bạn biết drawText() sẽ vẽ văn bản trong trường hợp x = 0 và y = 0. Vì vậy, bạn phải chống lại hành vi này bằng cách trừ đi sự dịch chuyển (textBounds.left và textBounds.top) được giới thiệu bằng cách văn bản được xử lý trong Android.

Trong this answer Tôi giải thích thêm một chút về chủ đề này.