Cách gán kích thước văn bản trong giá trị sp bằng mã java


205

Nếu tôi chỉ định một giá trị số nguyên để thay đổi kích thước văn bản nhất định của TextViewmã java bằng cách sử dụng, giá trị đó được hiểu là pixel ( px).

Bây giờ có ai biết làm thế nào để gán nó trong sp?

Câu trả lời:


535

http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29

Thí dụ:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

18
Vì SP là viết tắt của các pixel được chia tỷ lệ, bạn sẽ cần giảm kích thước theo mật độ màn hình. Việc này được thực hiện dễ dàng như sau: SCREEN_DENSITY = getResource (). GetDisplayMetrics (). Mật độ; yourView.setTextSize (TypedValue.COMPLEX_UNITinks, (wishTextHeightInSP / SCREEN_DENSITY);
PeteH

4
Giải pháp không hiệu quả với tôi khi tôi cố thu thập SP từ các tài nguyên. PeteH, bạn đã đưa tôi đi đúng hướng! Sau đây đã thực hiện thủ thuật cho tôi: ... float textSize = getResource (). GetDimension (R.dimen.textsize) / getResource (). GetDisplayMetrics (). Mật độ; myTextView.setTextSize (TypedValue.COMPLEX_UNITinks, textSize);
P Kuijpers

52
Nếu bạn nhận được kích thước sp từ tài nguyên của mình, bạn nên sử dụng COMPLEX_UNIT_PX, như thế này: textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));Lấy kích thước văn bản của bạn theo cách này sẽ chuyển SP thành PX, lấy cả mật độ màn hình và hệ số tỷ lệ văn bản trong tài khoản.
Ciske Boekelo

Các giải pháp được cung cấp làm việc cho tôi như được hiển thị. Cảm ơn!
Martin Erlic

35

Bạn có thể sử dụng một DisplayMetricsđối tượng để giúp chuyển đổi giữa các pixel và các pixel được chia tỷ lệ với scaledDensitythuộc tính .

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 

1
Điều này sẽ tính đến yếu tố tỷ lệ mật độ màn hình nhưng không phải là yếu tố tỷ lệ văn bản mà người dùng có thể đã chỉ định thông qua cài đặt. Tôi tin rằng giải pháp của @ Santosh sẽ tính đến yếu tố này trong khi đoạn trích này thì không.
greg7gkb

3
Nhưng đôi khi bạn không thể sử dụng phương thức @Santosh chẳng hạn khi bạn viết Paint vào khung vẽ. Sau đó, phương pháp này có ích và hoạt động khá tốt, do đó hãy đồng ý cho hai câu trả lời này!
tạm biệt

@ greg7gkb không đúng, tài liệu cho biết may be adjusted in smaller increments at runtime based on a user preference for the font sizekích thước phông chữ sẽ được tính đến.
Luca Vitucci

32

Cách tiếp cận sạch hơn và có thể tái sử dụng là

xác định kích thước văn bản trong dimens.xmltập tin bên trong res/values/thư mục:

</resources>
   <dimen name="text_medium">14sp</dimen>
</resources>

và sau đó áp dụng nó cho TextView:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));

20

Dựa trên mã nguồn của setTextSize:

public void setTextSize(int unit, float size) {
    Context c = getContext();
    Resources r;

    if (c == null)
        r = Resources.getSystem();
    else
        r = c.getResources();

    setRawTextSize(TypedValue.applyDimension(
        unit, size, r.getDisplayMetrics()));
}

Tôi xây dựng chức năng này để tính toán bất kỳ hạ cấp nào thành pixel:

int getPixels(int unit, float size) {
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    return (int)TypedValue.applyDimension(unit, size, metrics);
}

Đơn vị ở đâu là như thế TypedValue.COMPLEX_UNIT_SP.


phương pháp cuối cùng là cứu người.
Ajibola

12

Theo mặc định setTextSize, không có đơn vị nào hoạt động trong SP (chia tỷ lệ pixel)

public void setTextSize (float size) 
Added in API level 1
Set the default text size to the given value, interpreted as "scaled pixel" units. This 
size is adjusted based on the current density and user font size preference.

11

Cảm ơn @John Leehey và @PeterH:

desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);

Vấn đề là nếu bạn xác định R.dimen.desired_sp thành 25 trong dimen.xml của bạn

  1. Trên thiết bị không phải HD: mong muốnSp vẫn là 25, mật độ = 1
  2. Trên thiết bị HD (như Nexus 7 thế hệ thứ 2): mong muốnSp trở thành 50 ish, mật độ = 2

11

Khi câu trả lời được chấp nhận không hoạt động (ví dụ: khi giao dịch với Paint), bạn có thể sử dụng:

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);

ok, nó hoạt động, đó là những gì tôi muốn, cảm ơn pomber đã chia sẻ nó!
Park Eun Neul

8
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))

Vui lòng giải thích cách đặt kích thước văn bản làm giá trị pixel (COMPLEX_UNIT_PX) sẽ hữu ích. OP muốn "gán kích thước văn bản theo giá trị sp"
Bö macht Blau

nếu bạn sử dụng COMPLEX_UNIT_PXbạn cần chia mật độ.
William Hu

Tôi nghĩ đó là vì getDimension đã chuyển đổi 'dp' thành 'px'
Ali Mousavi Kherad

3

Đây là mã cho định dạng PX chuyển đổi sang SP . Công trình 100%

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

0

Sau khi thử tất cả các giải pháp và không có kết quả nào có thể chấp nhận được (có thể do tôi đang làm việc trên một thiết bị có phông chữ rất lớn mặc định), các cách sau đã hoạt động với tôi (COMPLEX_UNIT_DIP = Điểm ảnh độc lập của thiết bị):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

0

Từ Api cấp 1, bạn có thể sử dụng public void setTextSize (float size)phương pháp.

Từ tài liệu:

Đặt kích thước văn bản mặc định thành giá trị đã cho, được hiểu là các đơn vị "pixel được chia tỷ lệ". Kích thước này được điều chỉnh dựa trên mật độ hiện tại và ưu tiên kích thước phông chữ của người dùng.

Tham số: size -> float: Kích thước pixel được chia tỷ lệ.

Vì vậy, bạn có thể đơn giản làm:

textView.setTextSize(12); // your size in sp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.