2010-06-30 39 views
6

Tôi đã cố gắng viết một số văn bản trên giao diện bề mặt mà tôi đã tạo. Nó hoạt động tốt, nếu tiêu đề là sai, và không có linebreak thêm vào văn bản. Nhưng nếu tôi thêm một tiêu đề và do đó một linebreak, linebreak không được in như mong đợi, nhưng thay vào đó là biểu tượng này [] in.Canvas.drawText (...) không in dấu ngắt dòng

Bất kỳ gợi ý nào tại sao?

@Override 
public void drawObject() { 
String text = ""; 
if (title) { 
    text = getGameBoard().getGame().getForeignProfile().getName() + "\n"; 
} 
text = text + getScoreAsString(); 
getGameBoard().getCanvas().drawText(text, 0, text.length(), getPosition().getX(), getPosition().getY(), getPaint()); 
} 

Trả lời

1

Biểu tượng [] có thể là ký tự dòng mới của bạn. Vì lý do gì, drawText() không biết cách xử lý các dòng mới.

Hoặc bỏ qua dòng mới hoặc gọi drawText() hai lần với vị trí Y được bù đắp để mô phỏng dòng mới.

+0

nhờ. Tôi không biết nó doesn0t hỗ trợ newline. thats thực sự gây phiền nhiễu. những gì bạn có nghĩa là với dải newline? – RoflcoptrException

+0

Sử dụng String.replace() để thay thế tất cả các phiên bản của "\ n" bằng "" (một chuỗi rỗng). –

+0

ah có đó không phải là vấn đề, mã ở trên là tình huống duy nhất mà tôi cần nó;) và như bạn có thể nhìn thấy nó thêm "\ n" bởi bản thân mình – RoflcoptrException

24

Bạn có thể thử một cái gì đó như sau để vẽ văn bản với linebreaks: Câu trả lời

Rect bounds = new Rect(); 
void drawString(Canvas canvas, Paint paint, String str, int x, int y) { 
    String[] lines = str.split("\n"); 

    int yoff = 0; 
    for (int i = 0; i < lines.length; ++i) { 
     canvas.drawText(lines[i], x, y + yoff, paint); 
     paint.getTextBounds(lines[i], 0, lines[i].length(), bounds); 
     yoff += bounds.height(); 
    } 
} 
8

dee là rực rỡ. Đoạn code dưới đây được dựa trên câu trả lời dee, nhưng với một số sửa đổi cho sở thích cá nhân:

  1. Gọi nó drawMultilineText (vì nó là loại tương đương với drawText
  2. Đặt các thông số theo thứ tự giống như drawText (văn bản, x , y, sơn và vải ở cuối)
  3. Lấy chiều cao dòng một lần khi bắt đầu khi chiều cao được trả về từ giới hạn phụ thuộc vào chiều cao của các chữ cái, tức là e không cao bằng E
  4. Thêm 20 % khoảng cách chiều cao giữa các dòng

    void drawMultilineText(String str, int x, int y, Paint paint, Canvas canvas) { 
        int  lineHeight = 0; 
        int  yoffset = 0; 
        String[] lines  = str.split("\n"); 
    
        // set height of each line (height of text + 20%) 
        paint.getTextBounds("Ig", 0, 2, mBounds); 
        lineHeight = (int) ((float) mBounds.height() * 1.2); 
        // draw each line 
        for (int i = 0; i < lines.length; ++i) { 
         canvas.drawText(lines[i], x, y + yoffset, paint); 
         yoffset = yoffset + lineHeight; 
        } 
    } 
    
+0

Magic !! Thx @dee đã lưu ngày của tôi – Billyjoker

4

Tiếp tục cải thiện cả câu trả lời của cả Dee và FrinkTheBrave. Tôi đã thêm một Rect vào phương thức để cho phép vẽ trong phạm vi chiều rộng cụ thể. Sẽ xem xét sửa đổi nó để chọn một kích thước phông chữ thích hợp và đảm bảo nó phù hợp trong khu vực chiều cao chính xác.

Điều này sẽ cho phép bạn chỉ định chiều rộng của các dòng bạn muốn viết rất hữu ích để chia nhỏ chuỗi văn bản chưa được định dạng thành các dòng có độ dài tương tự và vẽ chúng vào canvas.

private void drawMultilineText(String str, int x, int y, Paint paint, Canvas canvas, int fontSize, Rect drawSpace) { 
    int  lineHeight = 0; 
    int  yoffset = 0; 
    String[] lines  = str.split(" "); 

    // set height of each line (height of text + 20%) 
    lineHeight = (int) (calculateHeightFromFontSize(str, fontSize) * 1.2); 
    // draw each line 
    String line = ""; 
    for (int i = 0; i < lines.length; ++i) { 

     if(calculateWidthFromFontSize(line + " " + lines[i], fontSize) <= drawSpace.width()){ 
      line = line + " " + lines[i]; 

     }else{ 
      canvas.drawText(line, x, y + yoffset, paint); 
      yoffset = yoffset + lineHeight; 
      line = lines[i]; 
     } 
    } 
    canvas.drawText(line, x, y + yoffset, paint); 

} 

private int calculateWidthFromFontSize(String testString, int currentSize) 
{ 
    Rect bounds = new Rect(); 
    Paint paint = new Paint(); 
    paint.setTextSize(currentSize); 
    paint.getTextBounds(testString, 0, testString.length(), bounds); 

    return (int) Math.ceil(bounds.width()); 
} 

private int calculateHeightFromFontSize(String testString, int currentSize) 
{ 
    Rect bounds = new Rect(); 
    Paint paint = new Paint(); 
    paint.setTextSize(currentSize); 
    paint.getTextBounds(testString, 0, testString.length(), bounds); 

    return (int) Math.ceil(bounds.height()); 
} 

Câu trả lời này bao gồm đoạn mã này xuất sắc tìm thấy ở đây trong một câu trả lời trước bởi user850688 https://stackoverflow.com/a/11353080/1759409

+0

và drawSpace sẽ là ...? – desgraci

+0

drawSpace là biến Rect mà bạn gửi cho phương thức sao cho phương thức này biết được một khu vực rộng lớn có sẵn để lấp đầy văn bản như thế nào. –

+0

@MusicMonkey không phải là chiều cao của mỗi dòng chính xác giống như kích thước phông chữ? –

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