ขนาดตัวอักษรและขนาดหน้าจอ Android ที่แตกต่างกัน


121

ฉันรู้ว่ามีการพูดคุยกันแล้ว 1,000 ครั้ง แต่ฉันไม่สามารถปรับขนาดตัวอักษรสำหรับขนาดหน้าจอที่แตกต่างกันได้ ฉันพยายามใช้ 'sp' เป็นหน่วยขนาดในสไตล์ที่ฉันกำหนดเอง:

<style name="CustumButtonStyle" parent="@android:style/Widget.Button">
    ...
    <item name="android:textSize">30sp</item>
    ...
</style>

ใน 2.7 QVGA ดูเหมือนว่า OK:

2.7QVGA 30sp

แต่ใน 7in WSVGA จะมีลักษณะดังนี้:

7 ใน WSVGA 30sp

ฉันได้ลองใช้ทั้ง 'sp' และ 'dp' ด้วยผลลัพธ์เดียวกัน

คุณช่วยอธิบายวิธีทำให้ปุ่มเหล่านี้ดูเหมือนกันบนหน้าจอได้ไหม

รูปแบบปุ่มแบบกำหนดเองแบบเต็ม

<style name="CustumButtonStyle" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/custom_button</item>
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_margin">3dp</item>
    <item name="android:textColor">#ffffff</item>
    <item name="android:gravity">center</item>
    <item name="android:textSize">30sp</item>
    <item name="android:textStyle">bold</item>
    <item name="android:shadowColor">#000000</item>
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
    <item name="android:shadowRadius">2</item>
</style>

และในธีมแอปพลิเคชันของฉันฉันมี

<item name="android:buttonStyle">@style/CustumButtonStyle</item>

และมีเค้าโครงของฉัน:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="fill_parent"
android:background="@drawable/grid"
android:gravity="center"
android:orientation="vertical" android:layout_height="fill_parent">

<Button
    android:id="@+id/buttonContinue"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_gravity="center"
    android:gravity="center"
    android:text="@string/continue_game" android:layout_marginTop="3dp" android:layout_marginBottom="3dp"/>



<Button
    android:id="@+id/buttonNewGame"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/buttonContinue"
    android:layout_alignRight="@+id/buttonContinue"
    android:layout_below="@+id/buttonContinue"
    android:layout_gravity="center"
    android:gravity="center"
    android:text="@string/new_game" android:layout_marginTop="3dp" android:layout_marginBottom="3dp"/>



<Button
    android:id="@+id/ButtonAbout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/buttonNewGame"
    android:layout_alignRight="@+id/buttonNewGame"
    android:layout_below="@+id/buttonNewGame"
    android:layout_gravity="center"
    android:gravity="center"
    android:text="@string/about" android:layout_marginTop="3dp" android:layout_marginBottom="3dp"/>


บนหน้าจอของคุณจะดูเหมือนกัน ตรวจสอบให้แน่ใจว่าขนาดผู้ชมของคุณคือ 100%
Dmitry Zaytsev

สามารถหาคำตอบได้จากที่นี่stackoverflow.com/questions/16706076/…
Bhavesh Jethani

คำตอบ:


160

@forcelain ฉันคิดว่าคุณต้องตรวจสอบGoogle IO Pdf for Designนี้ ใน pdf นั้นไปที่ Page No: 77 ซึ่งคุณจะพบว่ามีการแนะนำการใช้ dimens.xml สำหรับอุปกรณ์ต่างๆของ android สำหรับตัวอย่างดูโครงสร้างด้านล่าง:

res/values/dimens.xml

res/values-small/dimens.xml

res/values-normal/dimens.xml

res/values-large/dimens.xml

res/values-xlarge/dimens.xml

สำหรับตัวอย่างที่คุณใช้ด้านล่าง dimens.xml ในค่า

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">18sp</dimen>
</resources>

ในโฟลเดอร์ค่าอื่นคุณต้องเปลี่ยนค่าสำหรับขนาดข้อความของคุณ

หมายเหตุ:ตามที่ระบุโดย @espinchi ขนาดเล็กปกติขนาดใหญ่และ xlarge ได้เลิกใช้งานแล้วตั้งแต่ Android 3.2 เพื่อสนับสนุนสิ่งต่อไปนี้:

การประกาศเลย์เอาต์แท็บเล็ตสำหรับ Android 3.2

สำหรับแท็บเล็ตรุ่นแรกที่ใช้ Android 3.0 วิธีที่เหมาะสมในการประกาศเลย์เอาต์ของแท็บเล็ตคือวางไว้ในไดเร็กทอรีที่มีคุณสมบัติการกำหนดค่า xlarge (ตัวอย่างเช่น res / layout-xlarge /) เพื่อให้รองรับแท็บเล็ตและขนาดหน้าจอประเภทอื่น ๆ โดยเฉพาะแท็บเล็ต 7 "Android 3.2 ขอแนะนำวิธีใหม่ในการระบุทรัพยากรสำหรับขนาดหน้าจอที่ไม่ต่อเนื่องกันมากขึ้นเทคนิคใหม่นี้ขึ้นอยู่กับจำนวนพื้นที่ที่คุณต้องการในการจัดวาง (เช่น ความกว้าง 600dp) แทนที่จะพยายามทำให้เค้าโครงของคุณพอดีกับกลุ่มขนาดทั่วไป (เช่นขนาดใหญ่หรือขนาดใหญ่)

เหตุผลในการออกแบบแท็บเล็ตขนาด 7 "นั้นยุ่งยากเมื่อใช้กลุ่มขนาดทั่วไปก็คือในทางเทคนิคแท็บเล็ต 7" อยู่ในกลุ่มเดียวกับโทรศัพท์มือถือ 5 "(กลุ่มใหญ่) ในขณะที่อุปกรณ์ทั้งสองนี้ดูเหมือนจะมีขนาดใกล้กัน จำนวนพื้นที่สำหรับ UI ของแอปพลิเคชันนั้นแตกต่างกันอย่างมากเช่นเดียวกับรูปแบบการโต้ตอบของผู้ใช้ดังนั้นหน้าจอขนาด 7 "และ 5" จึงไม่ควรใช้เค้าโครงเดียวกันเสมอไปเพื่อให้คุณสามารถจัดเตรียมเค้าโครงที่แตกต่างกันสำหรับสิ่งเหล่านี้ได้ หน้าจอสองประเภทตอนนี้ Android ช่วยให้คุณสามารถระบุทรัพยากรการจัดวางของคุณตามความกว้างและ / หรือความสูงที่มีอยู่จริงสำหรับเลย์เอาต์ของแอปพลิเคชันของคุณซึ่งระบุเป็นหน่วย dp

ตัวอย่างเช่นหลังจากที่คุณออกแบบเลย์เอาต์ที่คุณต้องการใช้สำหรับอุปกรณ์แบบแท็บเล็ตแล้วคุณอาจพิจารณาได้ว่าเค้าโครงจะหยุดทำงานได้ดีเมื่อหน้าจอกว้างน้อยกว่า 600dp เกณฑ์นี้จึงกลายเป็นขนาดขั้นต่ำที่คุณต้องการสำหรับการจัดวางแท็บเล็ตของคุณ ด้วยเหตุนี้คุณจึงระบุได้ว่าควรใช้ทรัพยากรโครงร่างเหล่านี้ก็ต่อเมื่อมีความกว้างอย่างน้อย 600dp สำหรับ UI ของแอปพลิเคชันของคุณ

คุณควรเลือกความกว้างและออกแบบให้เป็นขนาดขั้นต่ำของคุณหรือทดสอบความกว้างที่เล็กที่สุดที่เลย์เอาต์รองรับเมื่อเสร็จสมบูรณ์

หมายเหตุ: โปรดจำไว้ว่าตัวเลขทั้งหมดที่ใช้กับ API ขนาดใหม่เหล่านี้เป็นค่าพิกเซลที่ไม่ขึ้นกับความหนาแน่น (dp) และมิติเค้าโครงของคุณควรกำหนดโดยใช้หน่วย dp เสมอเนื่องจากสิ่งที่คุณสนใจคือจำนวนพื้นที่หน้าจอที่มีอยู่หลังจากระบบ บัญชีสำหรับความหนาแน่นของหน้าจอ (ตรงข้ามกับการใช้ความละเอียดพิกเซลแบบดิบ) สำหรับข้อมูลเพิ่มเติมเกี่ยวกับพิกเซลที่ไม่ขึ้นกับความหนาแน่นโปรดอ่านข้อกำหนดและแนวคิดก่อนหน้านี้ในเอกสารนี้ การใช้ตัวระบุขนาดใหม่

การกำหนดค่าทรัพยากรต่างๆที่คุณสามารถระบุได้ตามพื้นที่ว่างสำหรับเลย์เอาต์ของคุณได้สรุปไว้ในตารางที่ 2 คุณสมบัติใหม่เหล่านี้ช่วยให้คุณควบคุมขนาดหน้าจอเฉพาะที่แอปพลิเคชันของคุณรองรับได้มากขึ้นเมื่อเทียบกับกลุ่มขนาดหน้าจอแบบเดิม (เล็กปกติ ใหญ่และ xlarge)

หมายเหตุ: ขนาดที่คุณระบุโดยใช้คุณสมบัติเหล่านี้ไม่ใช่ขนาดหน้าจอจริง แต่ขนาดมีไว้สำหรับความกว้างหรือความสูงในหน่วย dp ที่พร้อมใช้งานสำหรับหน้าต่างกิจกรรมของคุณ ระบบ Android อาจใช้หน้าจอบางส่วนสำหรับ UI ของระบบ (เช่นแถบระบบที่ด้านล่างของหน้าจอหรือแถบสถานะที่ด้านบน) ดังนั้นหน้าจอบางส่วนอาจไม่พร้อมใช้งานสำหรับเค้าโครงของคุณ ดังนั้นขนาดที่คุณประกาศควรเป็นขนาดที่จำเป็นสำหรับกิจกรรมของคุณโดยเฉพาะระบบจะคำนวณพื้นที่ใด ๆ ที่ UI ของระบบใช้เมื่อประกาศว่ามีพื้นที่เท่าใดสำหรับเลย์เอาต์ของคุณ นอกจากนี้โปรดระวังว่า Action Bar ถือเป็นส่วนหนึ่งของพื้นที่หน้าต่างของแอปพลิเคชันของคุณแม้ว่าเค้าโครงของคุณจะไม่ได้ประกาศไว้ก็ตามดังนั้นจะช่วยลดพื้นที่ว่างสำหรับเลย์เอาต์ของคุณและคุณต้องคำนึงถึงมันในการออกแบบของคุณ

ตารางที่ 2. คุณสมบัติการกำหนดค่าใหม่สำหรับขนาดหน้าจอ (แนะนำใน Android 3.2) การกำหนดค่าหน้าจอค่า Qualifier คำอธิบายขนาดเล็กที่สุดความกว้าง swdp

ตัวอย่าง: sw600dp sw720dp

ขนาดพื้นฐานของหน้าจอตามขนาดที่สั้นที่สุดของพื้นที่หน้าจอที่มี โดยเฉพาะอย่างยิ่งความกว้างที่เล็กที่สุดของอุปกรณ์คือความสูงและความกว้างที่สั้นที่สุดของหน้าจอ (คุณอาจคิดว่าเป็น "ความกว้างที่เล็กที่สุดเท่าที่จะเป็นไปได้" สำหรับหน้าจอ) คุณสามารถใช้คุณสมบัตินี้เพื่อให้แน่ใจว่าแอปพลิเคชันของคุณมีความกว้างอย่างน้อย dps สำหรับ UI โดยไม่คำนึงถึงการวางแนวปัจจุบันของหน้าจอ

ตัวอย่างเช่นหากเลย์เอาต์ของคุณต้องการให้พื้นที่หน้าจอมีขนาดเล็กที่สุดอย่างน้อย 600 dp ตลอดเวลาคุณสามารถใช้คุณสมบัตินี้เพื่อสร้างทรัพยากรการจัดวาง res / layout-sw600dp / ระบบจะใช้ทรัพยากรเหล่านี้เฉพาะเมื่อขนาดที่เล็กที่สุดของหน้าจอที่มีอยู่อย่างน้อย 600dp ไม่ว่าด้าน 600dp จะเป็นความสูงหรือความกว้างที่ผู้ใช้รับรู้ ความกว้างที่เล็กที่สุดคือลักษณะขนาดหน้าจอคงที่ของอุปกรณ์ ความกว้างที่เล็กที่สุดของอุปกรณ์จะไม่เปลี่ยนแปลงเมื่อการวางแนวหน้าจอเปลี่ยนไป

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

นี่เป็นอีกทางเลือกหนึ่งของตัวระบุขนาดหน้าจอทั่วไป (เล็กปกติใหญ่ xlarge) ที่ช่วยให้คุณกำหนดตัวเลขที่ไม่ต่อเนื่องสำหรับขนาดที่มีประสิทธิภาพสำหรับ UI ของคุณ การใช้ขนาดเล็กที่สุดในการกำหนดขนาดหน้าจอทั่วไปมีประโยชน์เนื่องจากความกว้างมักเป็นปัจจัยผลักดันในการออกแบบเค้าโครง UI มักจะเลื่อนในแนวตั้ง แต่มีข้อ จำกัด ค่อนข้างยากเกี่ยวกับพื้นที่ขั้นต่ำที่ต้องการในแนวนอน ความกว้างที่พร้อมใช้งานยังเป็นปัจจัยสำคัญในการพิจารณาว่าจะใช้เค้าโครงแบบบานหน้าต่างเดียวสำหรับโทรศัพท์มือถือหรือเค้าโครงหลายบานสำหรับแท็บเล็ต ดังนั้นคุณน่าจะสนใจมากที่สุดเกี่ยวกับความกว้างที่เล็กที่สุดเท่าที่จะเป็นไปได้ในแต่ละอุปกรณ์ ความกว้างของหน้าจอ wdp

ตัวอย่าง: w720dp w1024dp

ระบุความกว้างต่ำสุดที่พร้อมใช้งานในหน่วย dp ที่ทรัพยากรควรใช้ - กำหนดโดยค่า ค่าที่สอดคล้องกันของระบบสำหรับความกว้างจะเปลี่ยนไปเมื่อการวางแนวหน้าจอสลับไปมาระหว่างแนวนอนและแนวตั้งเพื่อสะท้อนความกว้างจริงในปัจจุบันที่มีให้สำหรับ UI ของคุณ

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

ตัวอย่าง: h720dp h1024dp เป็นต้น

ระบุความสูงขั้นต่ำของหน้าจอในหน่วย dp ที่ควรใช้ทรัพยากร - กำหนดโดยค่า ค่าที่สอดคล้องกันของระบบสำหรับความสูงจะเปลี่ยนไปเมื่อการวางแนวของหน้าจอสลับไปมาระหว่างแนวนอนและแนวตั้งเพื่อสะท้อนความสูงจริงในปัจจุบันที่มีให้สำหรับ UI ของคุณ

การใช้สิ่งนี้เพื่อกำหนดความสูงที่ต้องการโดยเค้าโครงของคุณมีประโยชน์ในลักษณะเดียวกับ wdp สำหรับกำหนดความกว้างที่ต้องการแทนที่จะใช้ทั้งขนาดหน้าจอและคุณสมบัติการวางแนว อย่างไรก็ตามแอปส่วนใหญ่ไม่จำเป็นต้องมีคุณสมบัตินี้เนื่องจาก UI มักจะเลื่อนในแนวตั้งดังนั้นจึงมีความยืดหยุ่นมากขึ้นตามความสูงที่มีในขณะที่ความกว้างนั้นเข้มงวดกว่า

แม้ว่าการใช้คุณสมบัติเหล่านี้อาจดูซับซ้อนกว่าการใช้กลุ่มขนาดหน้าจอ แต่จริงๆแล้วควรจะง่ายกว่าเมื่อคุณกำหนดข้อกำหนดสำหรับ UI ของคุณแล้ว เมื่อคุณออกแบบ UI สิ่งสำคัญที่คุณอาจสนใจคือขนาดจริงที่แอปพลิเคชันของคุณสลับไปมาระหว่าง UI สไตล์โทรศัพท์มือถือและ UI แบบแท็บเล็ตที่ใช้บานหน้าต่างหลายบาน จุดที่แน่นอนของสวิตช์นี้จะขึ้นอยู่กับการออกแบบเฉพาะของคุณบางทีคุณอาจต้องการความกว้าง 720dp สำหรับเลย์เอาต์แท็บเล็ตของคุณอาจจะ 600dp ก็เพียงพอแล้วหรือ 480dp หรือตัวเลขระหว่างสิ่งเหล่านี้ การใช้คุณสมบัติเหล่านี้ในตารางที่ 2 คุณสามารถควบคุมขนาดที่แน่นอนที่จะเปลี่ยนแปลงเค้าโครงของคุณได้

สำหรับการอภิปรายเพิ่มเติมเกี่ยวกับคุณสมบัติการกำหนดค่าขนาดเหล่านี้โปรดดูเอกสารการให้ทรัพยากร ตัวอย่างการกำหนดค่า

เพื่อช่วยคุณกำหนดเป้าหมายการออกแบบบางอย่างสำหรับอุปกรณ์ประเภทต่างๆตัวเลขบางส่วนสำหรับความกว้างหน้าจอทั่วไปมีดังนี้

320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc).
480dp: a tweener tablet like the Streak (480x800 mdpi).
600dp: a 7 tablet (600x1024 mdpi).
720dp: a 10 tablet (720x1280 mdpi, 800x1280 mdpi, etc).

การใช้ตัวกำหนดขนาดจากตารางที่ 2 แอปพลิเคชันของคุณสามารถสลับไปมาระหว่างทรัพยากรรูปแบบต่างๆสำหรับโทรศัพท์มือถือและแท็บเล็ตโดยใช้ตัวเลขที่คุณต้องการสำหรับความกว้างและ / หรือความสูง ตัวอย่างเช่นหาก 600dp เป็นความกว้างที่เล็กที่สุดที่มีที่รองรับโดยเลย์เอาต์แท็บเล็ตของคุณคุณสามารถจัดเตรียมเค้าโครงสองชุดนี้ได้:

res / layout / main_activity.xml # สำหรับโทรศัพท์มือถือ res / layout-sw600dp / main_activity.xml # สำหรับแท็บเล็ต

ในกรณีนี้ความกว้างที่เล็กที่สุดของพื้นที่หน้าจอที่มีอยู่จะต้องเป็น 600dp เพื่อให้สามารถใช้รูปแบบแท็บเล็ตได้

สำหรับกรณีอื่น ๆ ที่คุณต้องการปรับแต่ง UI เพิ่มเติมเพื่อแยกความแตกต่างระหว่างขนาดเช่นแท็บเล็ต 7” และ 10” คุณสามารถกำหนดเค้าโครงความกว้างที่เล็กที่สุดเพิ่มเติมได้:

res / layout / main_activity.xml # สำหรับโทรศัพท์มือถือ (มีความกว้างน้อยกว่า 600dp) res / layout-sw600dp / main_activity.xml # สำหรับแท็บเล็ตขนาด 7 นิ้ว (กว้าง 600dp และใหญ่กว่า) res / layout-sw720dp / main_activity.xml

สำหรับแท็บเล็ตขนาด 10 นิ้ว (กว้าง 720dp ขึ้นไป)

โปรดสังเกตว่าทรัพยากรตัวอย่างสองชุดก่อนหน้านี้ใช้ตัวระบุ "ความกว้างน้อยที่สุด" คือ swdp ซึ่งระบุด้านที่เล็กที่สุดของหน้าจอทั้งสองด้านโดยไม่คำนึงถึงการวางแนวปัจจุบันของอุปกรณ์ ดังนั้นการใช้ swdp จึงเป็นวิธีง่ายๆในการระบุขนาดหน้าจอโดยรวมที่มีให้สำหรับเลย์เอาต์ของคุณโดยไม่สนใจการวางแนวหน้าจอ

อย่างไรก็ตามในบางกรณีสิ่งที่สำคัญสำหรับการจัดวางของคุณคือความกว้างหรือความสูงที่มีอยู่ในปัจจุบัน ตัวอย่างเช่นหากคุณมีเค้าโครงสองบานที่มีชิ้นส่วนสองชิ้นอยู่เคียงข้างกันคุณอาจต้องการใช้เมื่อใดก็ตามที่หน้าจอมีความกว้างอย่างน้อย 600dp ไม่ว่าอุปกรณ์จะอยู่ในแนวนอนหรือแนวตั้ง ในกรณีนี้ทรัพยากรของคุณอาจมีลักษณะดังนี้:

res / layout / main_activity.xml # สำหรับโทรศัพท์มือถือ (มีความกว้างน้อยกว่า 600dp) res / layout-w600dp / main_activity.xml # Multi-pane (หน้าจอใดก็ได้ที่มีความกว้าง 600dp ขึ้นไป)

สังเกตว่าชุดที่สองใช้ qualifier "available width", wdp ด้วยวิธีนี้อุปกรณ์เครื่องหนึ่งอาจใช้ทั้งสองรูปแบบขึ้นอยู่กับการวางแนวของหน้าจอ (หากความกว้างที่มีอยู่อย่างน้อย 600dp ในแนวเดียวและน้อยกว่า 600dp ในการวางแนวอื่น)

หากความสูงที่มีอยู่เป็นปัญหาสำหรับคุณคุณสามารถทำได้โดยใช้คุณสมบัติ hdp หรือแม้กระทั่งรวมคุณสมบัติ wdp และ hdp ถ้าคุณต้องการเฉพาะเจาะจงจริงๆ


7
ขนาดเล็ก / ปกติ / ใหญ่ / xlarge เหล่านี้เลิกใช้งานแล้วในขณะนี้ (ธ.ค. 2014) วิธีที่แนะนำตอนนี้คือการใช้ "swxxxdp" ดูdeveloper.android.com/guide/practices/…
espinchi

1
@espinchi ขอบคุณคุณควรโพสต์สิ่งนี้เพื่อเป็นคำตอบ มี DP แนะนำด้วยหรือไม่? ตัวอย่างเช่นมาตรฐาน: 100sw, 200sw, 400sw, 600sw
Vince V.

19

ฉันคิดว่ามันสายเกินไปที่จะตอบกลับชุดข้อความนี้ แต่ฉันต้องการแบ่งปันความคิดหรือวิธีการแก้ไขปัญหาขนาดตัวอักษรบนอุปกรณ์ความละเอียดที่แตกต่างกัน ไซต์นักพัฒนา Android หลายแห่งแนะนำว่าเราต้องใช้หน่วยspสำหรับขนาดตัวอักษรซึ่งจะรองรับขนาดตัวอักษรสำหรับอุปกรณ์ที่มีความละเอียดแตกต่างกัน แต่ฉันมักจะไม่ได้ผลลัพธ์ที่ต้องการ ดังนั้นฉันจึงพบวิธีแก้ปัญหาหนึ่งที่ฉันใช้จาก 4-5 โปรเจ็กต์ล่าสุดของฉันและมันใช้งานได้ดี ตามคำแนะนำของฉันคุณต้องวางขนาดตัวอักษรสำหรับอุปกรณ์ความละเอียดแต่ละเครื่องซึ่งเป็นงานที่น่าเบื่อเล็กน้อย แต่จะตอบสนองความต้องการของคุณ นักพัฒนาแต่ละคนมีต้องฟังเกี่ยวกับอัตราส่วนเช่น4: 6: 8: 12 (h: XH: xxh: xxxh ตามลำดับ) ตอนนี้ภายในโฟลเดอร์resโครงการของคุณคุณต้องสร้าง 4 โฟลเดอร์ด้วยไฟล์ dimens เช่น

  1. ความละเอียด / ค่า-hdpi / dimens.xml
  2. ความละเอียด / ค่า-XHDPI / dimens.xml
  3. ความละเอียด / ค่า-xxhdpi / dimens.xml
  4. ความละเอียด / ค่า-xxxhdpi / dimens.xml

ตอนนี้อยู่ในไฟล์ dimens.xml คุณต้องวางขนาดข้อความ ฉันกำลังแสดงรหัสสำหรับค่า hdpiในทำนองเดียวกันคุณต้องวางโค้ดสำหรับไฟล์ค่าความละเอียด / dimens.xml อื่น ๆ

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">4px</dimen>
</resources>

สำหรับความละเอียดอื่น ๆ ก็เช่นxhdpi : 6px, xxhdpi : 8px, xxxhdpi : 12px สิ่งนี้คำนวณด้วยอัตราส่วน (3: 4: 6: 8: 12) ที่ฉันได้เขียนไว้ข้างต้น ให้พูดถึงตัวอย่างขนาดข้อความอื่น ๆ ที่มีอัตราส่วนข้างต้น หากคุณต้องการใช้ขนาดตัวอักษร 12px ใน hdpi ความละเอียดอื่น ๆ ก็จะเป็น

  1. hdpi: 12px
  2. xhdpi: 18px
  3. xxhdpi: 24px
  4. xxxhdpi: 36px

นี่เป็นวิธีง่ายๆในการใช้ขนาดข้อความที่ต้องการสำหรับความละเอียดทั้งหมด ฉันไม่ได้พิจารณาอุปกรณ์ความละเอียดค่า mdpiที่นี่ ถ้าคนใดคนหนึ่งต้องการให้มีขนาดตัวอักษรสำหรับการแก้ปัญหานี้แล้วปันส่วนเป็นเหมือน3: 4: 6: 8: 12 ในข้อสงสัยใด ๆ โปรดแจ้งให้เราทราบ หวังว่ามันจะช่วยคุณได้


4
การใช้ px แทน sp ในขนาดตัวอักษรเป็นวิธีปฏิบัติที่ไม่ดีใช่หรือไม่? มีวิธีที่จะบรรลุอัตราส่วนต่อไปนี้โดยใช้ sp แทน px หรือไม่?
แดง

ฉันตรวจสอบว่าสิ่งนี้ใช้งานได้ดี แต่ฉันยังงงอยู่ว่าควรใช้ค่าเป็น px แทน dp / sp หรือไม่? ฉันไม่เคยเห็นที่ไหนจากเอกสารอย่างเป็นทางการที่จะใช้ค่าเป็น px
shaby

1
ใช้ sp สำหรับขนาดตัวอักษรนั่นคือกฎหมาย แนวทางที่ราหุลแสดงนั้นถูกต้องเพียงแค่ใช้ sp แทน px
Mihir Patel

ควรใช้ sp หากวางแผนที่จะเชื่อมโยงขนาดฟอนต์ของแอพกับขนาดฟอนต์ของระบบมิฉะนั้นวิธีนี้ก็ไม่เลว
Irfan Ul Haq

12

บางครั้งก็ควรมีเพียงสามตัวเลือกเท่านั้น

 style="@android:style/TextAppearance.Small"

ใช้ขนาดเล็กและขนาดใหญ่เพื่อสร้างความแตกต่างจากขนาดหน้าจอปกติ

<TextView
            android:id="@+id/TextViewTopBarTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@android:style/TextAppearance.Small"/>

สำหรับปกติคุณไม่ต้องระบุอะไร

<TextView
            android:id="@+id/TextViewTopBarTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

เมื่อใช้สิ่งนี้คุณสามารถหลีกเลี่ยงการทดสอบและระบุขนาดสำหรับขนาดหน้าจอต่างๆได้


10

ฉันทำแบบเดียวกันตามมิติและวาดบางอย่างเช่น (ด้วย dp แต่สำหรับข้อความและใน drawText ())

XML:

   <dimen name="text_size">30sp</dimen>

รหัส:

   Paint p =new Paint();
       p.setTextSize(getResources().getDimension(R.dimen.text_Size));

8
คุณไม่ควรใช้dpสำหรับขนาดตัวอักษร ... ใช้spแทน
Yousha Aleayoub

โปรดใช้ sp สำหรับขนาดข้อความ
Thinsky

คุณสามารถใช้ dp ในสถานการณ์เฉพาะเมื่อคุณไม่ต้องการให้ปรับขนาดตามความชอบของผู้ใช้

7

ทุกคนสามารถใช้ไลบรารี Android ที่กล่าวถึงด้านล่างซึ่งเป็นวิธีที่ง่ายที่สุดในการสร้างขนาดข้อความที่เข้ากันได้กับหน้าจออุปกรณ์เกือบทั้งหมด มันพัฒนาบนพื้นฐานของคุณสมบัติการกำหนดค่า Android ใหม่สำหรับขนาดหน้าจอ (แนะนำใน Android 3.2) Swdp ที่เล็กที่สุด

https://github.com/intuit/sdp


2
sdpสำหรับขนาดหน้าจอ ใช้sspสำหรับขนาดข้อความ
ecle

สิ่งนี้ใช้ได้กับฉัน แต่ฉันสงสัยว่ามีไฟล์ที่จะเพิ่มมากเกินไปสิ่งนี้จะเพิ่มขนาดของแอป @ มูฮัมมัดคุณสามารถปรับขนาดและเพิ่มเฉพาะชั้นเรียนตามที่ต้องการ
Kirtikumar A.

1

หากคุณมี API 26 คุณอาจพิจารณาใช้autoSizeTextType :

<Button
  app:autoSizeTextType="uniform" />

การตั้งค่าเริ่มต้นช่วยให้สามารถปรับขนาดมาตราส่วน TextView ได้โดยอัตโนมัติบนแกนแนวนอนและแนวตั้ง

https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview


ปัญหานี้คือมันไม่ได้เปลี่ยนขนาดตัวอักษรอย่างสม่ำเสมอสำหรับการดูข้อความหลายรายการที่มีสตริงที่มีความยาวต่างกัน
Sourabh S Nath

0

ฉันคิดว่าคุณสามารถเก็บถาวรได้โดยเพิ่มทรัพยากรเค้าโครงหลายรายการสำหรับแต่ละขนาดหน้าจอ

res/layout/my_layout.xml             // layout for normal screen size ("default")
res/layout-small/my_layout.xml       // layout for small screen size with small text
res/layout-large/my_layout.xml       // layout for large screen size with larger text
res/layout-xlarge/my_layout.xml      // layout for extra large screen size with even larger text
res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation

อ้างอิง: 1. http://developer.android.com/guide/practices/screens_support.html


2
ใช้ res / values-small อาจจะดีกว่า
einverne

1
การใช้งานที่แย่กว่าอย่างหนึ่ง เราต้องรักษา 5 เลย์เอาต์เพื่อรองรับขนาดที่แตกต่างกัน?
SolidSnake

การสร้างเค้าโครงที่แตกต่างกันเพื่อลดขนาดตัวอักษรในหน้าจอที่แตกต่างกันเป็นความคิดที่ไม่ดีจริงๆ ฉันไม่แนะนำอย่างนั้น
สมานซาลี

0

ในการรวมหน้าจอทั้งหมดเพื่อแสดงขนาดองค์ประกอบเดียวกันรวมถึงขนาดตัวอักษร: - ออกแบบ UI บนขนาดหน้าจอเดียวด้วยขนาดใดก็ได้ที่คุณเห็นว่าเหมาะสมในระหว่างการออกแบบเช่นขนาดตัวอักษร TextView คือ 14dp สำหรับขนาดหน้าจอเริ่มต้นที่ 4'6 นิ้ว

  • คำนวณขนาดหน้าจอจริงของโทรศัพท์อื่น ๆ โดยใช้โปรแกรมเช่น 5'2 นิ้วของโทรศัพท์ / หน้าจออื่น ๆ

  • ใช้สูตรคำนวณเปอร์เซ็นต์ความแตกต่างระหว่าง 2 หน้าจอ คือ% ความแตกต่างระหว่าง 4'6 และ 5'2 คืออะไร

  • คำนวณความแตกต่างของพิกเซลระหว่าง 2 TextViews ตามสูตรข้างต้น

  • รับขนาดจริง (เป็นพิกเซล) ของขนาดฟอนต์ TextView และใช้ความแตกต่างของพิกเซล (ที่คุณคำนวณไว้ก่อนหน้านี้) กับขนาดฟอนต์เริ่มต้น

ด้วยวิธีนี้คุณสามารถใช้อัตราส่วนภาพแบบไดนามิกกับขนาดหน้าจอทั้งหมดและผลลัพธ์ก็ยอดเยี่ยม คุณจะมีเค้าโครงและขนาดที่เหมือนกันในแต่ละหน้าจอ

ในตอนแรกอาจเป็นเรื่องยุ่งยากเล็กน้อย แต่จะบรรลุเป้าหมายโดยสิ้นเชิงเมื่อคุณคิดสูตรออกมาได้ ด้วยวิธีนี้คุณไม่จำเป็นต้องสร้างเลย์เอาต์หลาย ๆ แบบเพื่อให้พอดีกับขนาดหน้าจอที่แตกต่างกัน


0

คุณยังสามารถใช้weightSumและlayout_weightคุณสมบัติเพื่อปรับหน้าจอต่างๆของคุณ

สำหรับสิ่งนั้นคุณต้องสร้างandroid:layout_width= 0dp และandroid:layout_width= (อะไรก็ได้ที่คุณต้องการ);



-2

อย่าฮาร์ดโค้ดขนาด

เพื่อความยืดหยุ่นในการโฆษณาความละเอียดหน้าจอใหม่แนวทางปฏิบัติที่ดีที่สุดคือการวาง Dummy TextView ลงในเค้าโครงเพื่อรับ textSize:

<TextView
        android:id="@+id/dummyTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:text="TextView" />

และในโค้ดของคุณตัวอย่างเช่น:

TextView testTextView = (TextView) rootView.findViewById(R.id.dummyTextView);
float textSize = testTextView.getTextSize();

เก็บไว้textSizeเป็นข้อมูลอ้างอิงซึ่งคุณสามารถเพิ่มค่าคงที่หรือขนาดต่อส่วน (โดยการคำนวณ)

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