วิธีกำหนดขนาดตัวอักษรในค่า sp โดยใช้รหัสจาวา


205

ถ้าฉันกำหนดค่าจำนวนเต็มเพื่อเปลี่ยนขนาดตัวอักษรของการTextViewใช้รหัสจาวาค่าจะถูกตีความเป็นพิกเซล ( px)

ตอนนี้ไม่มีใครรู้วิธีที่จะกำหนดไว้ในsp?

คำตอบ:


535

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

ตัวอย่าง:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

18
เนื่องจาก SP ย่อมาจากพิกเซลที่ปรับขนาดคุณจะต้องลดขนาดตามความหนาแน่นของหน้าจอ สามารถทำได้อย่างง่ายดายดังนี้ SCREEN_DENSITY = getResources (). getDisplayMetrics (). density; yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (ที่ต้องการ TextHeightInSP / SCREEN_DENSITY);
PeteH

4
โซลูชันไม่ทำงานสำหรับฉันเมื่อฉันพยายามรวบรวม SP จากทรัพยากร PeteH คุณได้รับฉันถูกทาง! ต่อไปนี้เป็นเคล็ดลับสำหรับฉัน: ... float textSize = getResources (). getDimension (R.dimen.textsize) / getResources (). getDisplayMetrics (). ความหนาแน่น; myTextView.setTextSize (TypedValue.COMPLEX_UNIT_SP, textSize);
P Kuijpers

52
หากคุณได้ขนาด sp จากแหล่งข้อมูลของคุณคุณควรใช้ COMPLEX_UNIT_PX เช่นนี้: textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));การรับขนาดตัวอักษรด้วยวิธีนี้จะแปลง SP เป็น PX แล้วโดยคำนึงถึงความหนาแน่นของหน้าจอและสัดส่วนข้อความ
Ciske Boekelo

โซลูชันที่ให้มาใช้ได้ผลกับฉันตามที่แสดง ขอบคุณ!
Martin Erlic

35

คุณสามารถใช้DisplayMetricsวัตถุที่จะช่วยเหลือในการแปลงระหว่างพิกเซลและปรับขนาดพิกเซลกับแอตทริบิวต์scaledDensity

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

1
สิ่งนี้จะคำนึงถึงปัจจัยการปรับขนาดความหนาแน่นของหน้าจอ แต่ไม่รวมถึงปัจจัยการปรับขนาดข้อความที่ผู้ใช้อาจระบุผ่านการตั้งค่า ฉันเชื่อว่าวิธีการแก้ปัญหาของ @ Santosh จะพิจารณาปัจจัยนี้ในขณะที่ข้อมูลโค้ดนี้ไม่
greg7gkb

3
แต่บางครั้งคุณไม่สามารถใช้วิธีการของ @Santosh ได้เช่นเมื่อคุณเขียน 'ระบายสี' ลงในผืนผ้าใบ จากนั้นวิธีการนี้มีประโยชน์และใช้งานได้ดีดังนั้นยกนิ้วให้สองคำตอบ!
byemute

1
@ greg7gkb ไม่เป็นความจริงเอกสารพูดว่าmay be adjusted in smaller increments at runtime based on a user preference for the font sizeดังนั้นขนาดตัวอักษรจะถูกนำมาพิจารณา
Luca Vitucci

32

วิธีการที่สะอาดและใช้ซ้ำได้มากขึ้นคือ

กำหนดขนาดตัวอักษรใน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));

20

ขึ้นอยู่กับรหัสแหล่งที่มาของ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ในกรณีที่หน่วยงานเป็นสิ่งที่ต้องการ


วิธีสุดท้ายคือการช่วยชีวิต
Ajibola

12

โดยค่าเริ่มต้น 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.

11

ขอบคุณ @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 ของคุณ

  1. บนอุปกรณ์ที่ไม่ใช่ HD: ต้องการ SP ยังคงเป็น 25, ความหนาแน่น = 1
  2. บนอุปกรณ์ HD (เช่น Nexus 7 2nd Generation): ต้องการ Sp กลายเป็น 50 ish, ความหนาแน่น = 2

11

เมื่อคำตอบที่ยอมรับไม่ทำงาน (ตัวอย่างเช่นเมื่อจัดการกับ Paint) คุณสามารถใช้:

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

ตกลงมันใช้งานได้นั่นคือสิ่งที่ฉันต้องการขอบคุณ pomber ที่แชร์มัน!
Mr. Lemon

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

โปรดอธิบายวิธีการตั้งค่าขนาดข้อความเป็นค่าพิกเซล (COMPLEX_UNIT_PX) จะมีประโยชน์ OP ต้องการ "กำหนดขนาดข้อความเป็นค่า sp"
Bö macht Blau

ถ้าคุณใช้COMPLEX_UNIT_PXคุณต้องแบ่งความหนาแน่น
William Hu

ฉันคิดว่าเป็นเพราะ getDimension แปลง 'dp' เป็น 'px' แล้ว
Ali Mousavi Kherad


0

หลังจากลองใช้วิธีแก้ปัญหาทั้งหมดและไม่มีใครให้ผลลัพธ์ที่ยอมรับได้ (อาจเป็นเพราะฉันทำงานบนอุปกรณ์ที่มีแบบอักษรเริ่มต้นที่มีขนาดใหญ่มาก) สิ่งต่อไปนี้ใช้ได้สำหรับฉัน (COMPLEX_UNIT_DIP = Device Independent Pixels):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

0

จาก Api ระดับ 1 คุณสามารถใช้public void setTextSize (float size)วิธีการ

จากเอกสาร:

ตั้งค่าขนาดข้อความเริ่มต้นเป็นค่าที่กำหนดตีความว่าเป็นหน่วย "พิกเซลที่ปรับขนาด" ขนาดนี้จะปรับตามความหนาแน่นปัจจุบันและการตั้งค่าขนาดตัวอักษรผู้ใช้

พารามิเตอร์: size -> float: ขนาดพิกเซลที่ปรับขนาด

ดังนั้นคุณสามารถทำได้ง่ายๆ:

textView.setTextSize(12); // your size in sp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.