ถ้าฉันกำหนดค่าจำนวนเต็มเพื่อเปลี่ยนขนาดตัวอักษรของการTextView
ใช้รหัสจาวาค่าจะถูกตีความเป็นพิกเซล ( px
)
ตอนนี้ไม่มีใครรู้วิธีที่จะกำหนดไว้ในsp
?
ถ้าฉันกำหนดค่าจำนวนเต็มเพื่อเปลี่ยนขนาดตัวอักษรของการTextView
ใช้รหัสจาวาค่าจะถูกตีความเป็นพิกเซล ( px
)
ตอนนี้ไม่มีใครรู้วิธีที่จะกำหนดไว้ในsp
?
คำตอบ:
http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29
ตัวอย่าง:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));
การรับขนาดตัวอักษรด้วยวิธีนี้จะแปลง SP เป็น PX แล้วโดยคำนึงถึงความหนาแน่นของหน้าจอและสัดส่วนข้อความ
คุณสามารถใช้DisplayMetrics
วัตถุที่จะช่วยเหลือในการแปลงระหว่างพิกเซลและปรับขนาดพิกเซลกับแอตทริบิวต์scaledDensity
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
ดังนั้นขนาดตัวอักษรจะถูกนำมาพิจารณา
วิธีการที่สะอาดและใช้ซ้ำได้มากขึ้นคือ
กำหนดขนาดตัวอักษรในdimens.xml
ไฟล์ภายในres/values/
ไดเรกทอรี:
</resources>
<dimen name="text_medium">14sp</dimen>
</resources>
แล้วนำไปใช้กับTextView
:
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));
ขึ้นอยู่กับรหัสแหล่งที่มาของ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()));
}
ฉันสร้างฟังก์ชั่นนี้สำหรับการคำนวณ demension ใด ๆ ถึงพิกเซล:
int getPixels(int unit, float size) {
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
return (int)TypedValue.applyDimension(unit, size, metrics);
}
TypedValue.COMPLEX_UNIT_SP
ในกรณีที่หน่วยงานเป็นสิ่งที่ต้องการ
โดยค่าเริ่มต้น setTextSize โดยไม่มีหน่วยทำงานใน SP (สเกลพิกเซล)
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.
ขอบคุณ @John Leehey และ @PeterH:
desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);
สิ่งนี้คือถ้าคุณกำหนด R.dimen.desired_sp เป็น 25 ใน dimen.xml ของคุณ
เมื่อคำตอบที่ยอมรับไม่ทำงาน (ตัวอย่างเช่นเมื่อจัดการกับ Paint) คุณสามารถใช้:
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
คุณต้องแบ่งความหนาแน่น
นี่คือรหัสสำหรับการแปลงรูปแบบPXเป็นSP ผลงาน 100%
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
หลังจากลองใช้วิธีแก้ปัญหาทั้งหมดและไม่มีใครให้ผลลัพธ์ที่ยอมรับได้ (อาจเป็นเพราะฉันทำงานบนอุปกรณ์ที่มีแบบอักษรเริ่มต้นที่มีขนาดใหญ่มาก) สิ่งต่อไปนี้ใช้ได้สำหรับฉัน (COMPLEX_UNIT_DIP = Device Independent Pixels):
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
จาก Api ระดับ 1 คุณสามารถใช้public void setTextSize (float size)
วิธีการ
จากเอกสาร:
ตั้งค่าขนาดข้อความเริ่มต้นเป็นค่าที่กำหนดตีความว่าเป็นหน่วย "พิกเซลที่ปรับขนาด" ขนาดนี้จะปรับตามความหนาแน่นปัจจุบันและการตั้งค่าขนาดตัวอักษรผู้ใช้
พารามิเตอร์: size -> float: ขนาดพิกเซลที่ปรับขนาด
ดังนั้นคุณสามารถทำได้ง่ายๆ:
textView.setTextSize(12); // your size in sp