2011-01-03 38 views
5

Tôi đang cố gắng vẽ các ký tự dây theo ký tự để thêm hiệu ứng ánh sáng vào các hình dạng bao gồm văn bản.Các vấn đề về Kerning khi vẽ ký tự văn bản theo ký tự

while (i != line.length()) { 
c = line.substring(i, i + 1); 

cWidth = g.getFontMetrics().stringWidth(c); 

g.drawString(c, xx += cWidth, yy); 
i++; 
} 

Vấn đề là, chiều rộng của ký tự không phải là khoảng cách thực tế được lấy từ một chuỗi. Có cách nào để có được khoảng cách chính xác trong graphics2d?

Trả lời

0

Tôi không chắc liệu tôi có hiểu chính xác vấn đề của bạn hay không. Tuy nhiên, tôi đã thử nghiệm mã của bạn và thực sự một số ký tự chuỗi chồng lên nhau.

Vấn đề là theo cách bạn tăng giá trị xx (bạn đã tăng nó trước khi vẽ một ký tự).

Dưới đây là điều chỉnh phiên bản của mã của bạn:

public void myDrawString(Graphics g, String line, int xx, int yy) { 
    int i = 0; 
    while (i != line.length()) { 
     String c = line.substring(i, i + 1); 
     int cWidth = g.getFontMetrics().stringWidth(c); 
     g.drawString(c, xx, yy); 
     xx += cWidth; 
     //xx += 2; 
     i++; 
    } 
} 

Bỏ ghi chú và điều chỉnh xx += 2 dòng để tăng khoảng cách giữa các ký tự.

0

Vấn đề là kerning định nghĩa khoảng cách của cặp chữ cái và lặp qua chuỗi char-by-char cho hệ thống kerning không có cơ hội để kick in. Tôi nghĩ bạn sẽ phải sử dụng một trong hai cố định phông chữ thông thường hoặc làm lại hiệu ứng ánh sáng của bạn để nó hoạt động với chuỗi đầy đủ thay vì ký tự đơn.

2

Câu trả lời của Lukas Baran giải quyết được vấn đề chính có thể khiến đầu ra của bạn trông xấu. Tuy nhiên, vấn đề tinh tế hơn mà bạn không thể sao chép kerning theo cách này vẫn còn. Có bao nhiêu vấn đề này có thể phụ thuộc vào phông chữ bạn đang sử dụng. Để có được quyền sành điệu, bạn cũng có thể làm một cái gì đó như thế này:

while (i != line.length()) { 
    String c = line.substring(i, i + 1); 
    String d = line.substring(0, i + 1); 
    int cWidth = g.getFontMetrics().stringWidth(c); 
    int dWidth = g.getFontMetrics().stringWidth(d); 
    g.drawString(c, xx + dWidth - cWidth, yy); 
    i++; 
} 

Điều đó sẽ đặt mỗi ký tự nơi kerning sẽ đặt nó.

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