2012-10-16 30 views
8

Tôi đã cố gắng tìm ra điều này trong vài ngày gần đây và đã không thành công ...Chiều cao dòng có thể chạy trên Android

Tôi đang học android ngay bây giờ và hiện đang tạo máy tính với lịch sử là dự án học tập của tôi. Tôi có một TextView có trách nhiệm hiển thị tất cả lịch sử ... Tôi đang sử dụng một phông chữ kỹ thuật số trông giống như một phông chữ máy tính, nhưng điều này chỉ có vẻ tốt cho chữ số và số thập phân và dấu phẩy. Tôi muốn tất cả các nhà khai thác được đánh dấu và trong một phông chữ khác nhau (Arial hẹp tại thời điểm này). Tôi đã có thể làm điều này để làm việc đẹp bằng cách sử dụng một chuỗi spannable nơi tôi chỉ định một màu phông chữ cũng như một phông chữ bằng cách sử dụng một lớp CustomTypeFaceSpan để áp dụng phông chữ tùy chỉnh của tôi.

Sự cố ... Khi tôi kết hợp Kiểu chữ, có vẻ như có vấn đề với chiều cao của dòng, vì vậy tôi đã tìm thấy this post minh họa sử dụng một lớp được xác định khác để áp dụng chiều cao dòng cho mỗi dòng văn bản có thể thêm được:

public class CustomLineHeightSpan implements LineHeightSpan{ 
    private final int height; 

    public CustomLineHeightSpan(int height){ 
     this.height = height; 
    } 

    @Override 
    public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, FontMetricsInt fm) { 
     fm.bottom += height; 
     fm.descent += height; 
    } 

} 

Điều này dường như không hoạt động và tôi không thể hiểu tại sao. Nếu tôi không áp dụng các kiểu chữ khác nhau, thì nó sẽ hiển thị như mong đợi không có khoảng trống phía trên dòng đầu tiên và khoảng cách khoảng 5px giữa các dòng. Khi tôi áp dụng các kiểu chữ thay thế, có khoảng cách khoảng 10 đến 15px phía trên dòng văn bản đầu tiên và khoảng cách dòng khoảng 10 đến 15px.

Không có sự khác biệt về kích thước phông chữ, chỉ có kiểu chữ. Tôi đang thiếu gì. Tôi đã triển khai CustomLineHeightSpan thực hiện LineHeightSpan và ghi đè phương thức selectHeight. Tôi gọi nó là như vậy:

WordtoSpan.setSpan (new CustomLineHeightSpan (10), operatorPositions.get (ii), operatorPositions.get (ii) + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Dường như không có vấn đề gì tôi đặt trong lệnh gọi đến CustomLineHeightSpan. Không có gì thay đổi ...

Bất kỳ ai có bất kỳ ý tưởng nào tôi đang bỏ lỡ ... Tôi chắc chắn đó là câu trả lời "Tôi không thể tin rằng tôi đã bỏ lỡ câu trả lời đó", nhưng dường như không thể tìm ra câu trả lời chốc lát.

Thanks for the guys giúp đỡ :-)

Trả lời

17

cuối cùng tôi đã tìm thấy một nữa trong ví dụ sâu của việc sử dụng LineHeightSpan ... Trên thực tế LineHeightSpan.WithDensity được chính xác hơn ... Sau đây là trích đoạn đã giúp tôi giải quyết vấn đề của tôi:

private static class Height implements LineHeightSpan.WithDensity { 
    private int mSize; 
    private static float sProportion = 0; 

    public Height(int size) { 
     mSize = size; 
    } 

    public void chooseHeight(CharSequence text, int start, int end, 
          int spanstartv, int v, 
          Paint.FontMetricsInt fm) { 
     // Should not get called, at least not by StaticLayout. 
     chooseHeight(text, start, end, spanstartv, v, fm, null); 
    } 

    public void chooseHeight(CharSequence text, int start, int end, 
          int spanstartv, int v, 
          Paint.FontMetricsInt fm, TextPaint paint) { 
     int size = mSize; 
     if (paint != null) { 
      size *= paint.density; 
     } 

     if (fm.bottom - fm.top < size) { 
      fm.top = fm.bottom - size; 
      fm.ascent = fm.ascent - size; 
     } else { 
      if (sProportion == 0) { 
       /* 
       * Calculate what fraction of the nominal ascent 
       * the height of a capital letter actually is, 
       * so that we won't reduce the ascent to less than 
       * that unless we absolutely have to. 
       */ 

       Paint p = new Paint(); 
       p.setTextSize(100); 
       Rect r = new Rect(); 
       p.getTextBounds("ABCDEFG", 0, 7, r); 

       sProportion = (r.top)/p.ascent(); 
      } 

      int need = (int) Math.ceil(-fm.top * sProportion); 

      if (size - fm.descent >= need) { 
       /* 
       * It is safe to shrink the ascent this much. 
       */ 

       fm.top = fm.bottom - size; 
       fm.ascent = fm.descent - size; 
      } else if (size >= need) { 
       /* 
       * We can't show all the descent, but we can at least 
       * show all the ascent. 
       */ 

       fm.top = fm.ascent = -need; 
       fm.bottom = fm.descent = fm.top + size; 
      } else { 
       /* 
       * Show as much of the ascent as we can, and no descent. 
       */ 

       fm.top = fm.ascent = -size; 
       fm.bottom = fm.descent = 0; 
      } 
     } 
    } 
} 

Điều này được lấy từ this example.

Những gì nó là như trích dẫn dưới đây:

Lực lượng dòng văn bản là chiều cao quy định, thu hẹp/duỗi đi lên nếu có thể, hoặc gốc nếu bị thu hẹp đi lên thêm sẽ làm cho văn bản không đọc được.

Tôi hy vọng điều này sẽ giúp người tiếp theo :-)

+1

cách gọi phương pháp này chooseHeight? – AndroidCrazy

+0

Android gọi phương thức này trong nội bộ. Tất cả bạn phải làm là cung cấp cho chuỗi của bạn span. Nếu bạn muốn biết thêm, hãy xem lớp android.text.StaticLayout. Các phương pháp cho các nhịp khác cũng được gọi ở đó. – thehayro

+3

Nếu chúng ta gặp tôi nợ bạn một ly bia (hoặc đồ uống khác của sự lựa chọn) - công cụ này là siêu tài liệu, và việc tìm kiếm phải mất một khoảng thời gian điên rồ. – secureboot

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