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 TextView
mã 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
?
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 TextView
mã 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:
http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29
Thí dụ:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
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.
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 scaledDensity
thuộc tính .
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity;
may be adjusted in smaller increments at runtime based on a user preference for the font size
kích thước phông chữ sẽ được tính đến.
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.xml
tậ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));
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
.
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.
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
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);
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
context.getResources().getDimension(R.dimen.text_size_in_dp))
COMPLEX_UNIT_PX
bạn cần chia mật độ.
Đâ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);
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);
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