คำปฏิเสธ
คำตอบนี้มาจาก 2013 และล้าสมัยอย่างจริงจัง ในฐานะของ Android 3.2 ตอนนี้มีความหนาแน่นของหน้าจอ 6 กลุ่ม คำตอบนี้จะได้รับการอัปเดตทันทีที่ฉันสามารถทำได้ แต่ไม่มี ETA อ้างอิงเอกสารอย่างเป็นทางการสำหรับความหนาแน่นทั้งหมดในขณะนี้ (แม้ว่าข้อมูลเกี่ยวกับขนาดพิกเซลที่เฉพาะเจาะจงนั้นหายากเสมอ)
นี่คือเวอร์ชันของ tl / dr
ด้วยวิธีนี้ Android จะเลือกไฟล์ที่เหมาะสมสำหรับความหนาแน่นของภาพจากนั้นจะยืดภาพตามมาตรฐาน 9-patch
จุดสิ้นสุดของ tl; dr โพสต์แบบเต็มล่วงหน้า
ฉันกำลังตอบคำถามที่เกี่ยวข้องกับการออกแบบของคำถาม ฉันไม่ใช่นักพัฒนาซอฟต์แวร์ดังนั้นฉันจะไม่สามารถให้รหัสสำหรับการใช้งานโซลูชันที่ให้ไว้มากมาย อนึ่งความตั้งใจของฉันคือการช่วยให้นักออกแบบที่หลงทางเหมือนตอนที่ฉันช่วยพัฒนาแอพ Android เครื่องแรกของฉัน
เหมาะสมทุกขนาด
สำหรับ Android บริษัท ต่างๆสามารถพัฒนาโทรศัพท์มือถือและตารางได้ทุกขนาดไม่ว่าจะมีความละเอียดเท่าใดก็ตาม ด้วยเหตุนี้จึงไม่มี "ขนาดภาพที่ถูกต้อง" สำหรับหน้าจอสแปลชเนื่องจากไม่มีความละเอียดหน้าจอคงที่ นั่นเป็นปัญหาสำหรับผู้ที่ต้องการใช้หน้าจอเริ่มต้น
ผู้ใช้ของคุณต้องการเห็นหน้าจอสแปลชจริงหรือ
(ในหมายเหตุด้านข้างหน้าจอสแปลชค่อนข้างท้อใจในหมู่ผู้ใช้งานเป็นที่ถกเถียงกันอยู่ว่าผู้ใช้รู้แอปที่เขาใช้งานอยู่แล้วและไม่จำเป็นต้องสร้างแบรนด์รูปภาพของคุณด้วยหน้าจอสแปลเพราะมันขัดจังหวะประสบการณ์ของผู้ใช้ "โฆษณา" ควรใช้อย่างไรก็ตามในแอปพลิเคชันที่ต้องโหลดจำนวนมากเมื่อเริ่มต้น (5s +) รวมถึงเกมและสิ่งนั้นเพื่อให้ผู้ใช้ไม่ติดสงสัยว่าแอปพลิเคชันขัดข้องหรือไม่)
ความหนาแน่นของหน้าจอ 4 คลาส
ดังนั้นด้วยความละเอียดหน้าจอที่แตกต่างกันมากมายในโทรศัพท์ในท้องตลาด Google จึงนำเสนอทางเลือกและโซลูชั่นที่ดีที่สามารถช่วยคุณได้ สิ่งแรกที่คุณต้องรู้ก็คือ Android จะแยกหน้าจอทั้งหมดออกเป็นความหนาแน่นของหน้าจอ 4 แบบ:
- ความหนาแน่นต่ำ (ldpi ~ 120dpi)
- ความหนาแน่นปานกลาง (mdpi ~ 160dpi)
- ความหนาแน่นสูง (hdpi ~ 240dpi)
- ความหนาแน่นสูงพิเศษ (xhdpi ~ 320dpi) (ค่า dpi เหล่านี้เป็นค่าประมาณเนื่องจากอุปกรณ์ที่สร้างขึ้นเองจะมีค่า dpi ที่แตกต่างกัน)
สิ่งที่คุณ (ถ้าคุณเป็นนักออกแบบ) ต้องรู้จากสิ่งนี้คือว่า Android เลือกจาก 4 ภาพที่จะแสดงโดยทั่วไปขึ้นอยู่กับอุปกรณ์ ดังนั้นคุณจำเป็นต้องออกแบบภาพที่แตกต่างกัน 4 ภาพ (แม้ว่าจะสามารถพัฒนาได้มากขึ้นสำหรับรูปแบบที่แตกต่างกันเช่นไวด์สกรีน, โหมดแนวตั้ง / แนวนอน ฯลฯ )
โดยคำนึงถึงสิ่งนี้ทราบ: เว้นแต่คุณจะออกแบบหน้าจอสำหรับทุกความละเอียดเดียวที่ใช้ใน Android ภาพของคุณจะยืดให้พอดีกับขนาดหน้าจอ และถ้าหากภาพของคุณนั้นเป็นแบบไล่ระดับสีหรือเบลอคุณก็จะได้ภาพที่ไม่ต้องการโดยการยืดออก ดังนั้นคุณมีสองตัวเลือกโดยทั่วไป: สร้างภาพสำหรับการรวมขนาด / ความหนาแน่นของแต่ละหน้าจอหรือสร้างภาพ 9-patch สี่ภาพ
ทางออกที่ยากที่สุดคือการออกแบบหน้าจอที่แตกต่างกันสำหรับทุกความละเอียด คุณสามารถเริ่มต้นได้โดยทำตามวิธีแก้ปัญหาในตารางในตอนท้ายของหน้านี้ (มีมากกว่านั้นตัวอย่าง: 960 x 720 ไม่มีอยู่ในรายการ) และสมมติว่าคุณมีรายละเอียดเล็ก ๆ น้อย ๆ ในภาพเช่นข้อความเล็ก ๆ คุณต้องออกแบบมากกว่าหนึ่งหน้าจอสำหรับแต่ละความละเอียด ตัวอย่างเช่นรูปภาพขนาด 480x800 ที่แสดงในหน้าจอขนาดกลางอาจดูโอเค แต่บนหน้าจอที่เล็กกว่า (ที่มีความหนาแน่น / dpi สูงกว่า) โลโก้อาจเล็กเกินไปหรือข้อความบางส่วนอาจอ่านไม่ได้
ภาพ 9 แพทช์
วิธีการแก้ปัญหาอื่น ๆ คือการสร้างภาพที่ 9 แพทช์ โดยทั่วไปจะมีเส้นขอบโปร่งใส 1 พิกเซลรอบ ๆ รูปภาพของคุณและโดยการวาดพิกเซลสีดำในพื้นที่ด้านบนและด้านซ้ายของเส้นขอบนี้คุณสามารถกำหนดว่าส่วนใดของรูปภาพที่จะยืดได้ ฉันจะไม่เข้าไปดูรายละเอียดว่าภาพแพทช์ 9 ตัวทำงานอย่างไรในระยะสั้นพิกเซลที่จัดตำแหน่งเครื่องหมายที่บริเวณด้านบนและด้านซ้ายคือพิกเซลที่จะทำซ้ำเพื่อยืดภาพ
กฎพื้นฐานบางประการ
- คุณสามารถทำให้ภาพเหล่านี้เป็น photoshop (หรือซอฟต์แวร์แก้ไขภาพใด ๆ ที่สามารถสร้าง png โปร่งใส)
- เส้นขอบ 1 พิกเซลต้องมีความโปร่งใสอย่างสมบูรณ์
- เส้นขอบโปร่งใส 1 พิกเซลจะต้องอยู่รอบภาพของคุณไม่ใช่เฉพาะด้านบนและด้านซ้าย
- คุณสามารถวาดพิกเซลดำ (# 000000) พิกเซลในพื้นที่นี้
- ขอบด้านบนและด้านซ้าย (ซึ่งกำหนดการยืดภาพ) สามารถมีหนึ่งจุด (1px x 1px) สองจุด (ทั้ง 1px x 1px) หรือหนึ่งบรรทัดต่อเนื่อง (ความกว้าง x 1px หรือ 1px x ความสูง)
- หากคุณเลือกที่จะใช้ 2 จุดรูปภาพจะถูกขยายตามสัดส่วน (ดังนั้นแต่ละจุดจะมีการผลัดกันขยายจนกว่าจะได้ความกว้าง / ความสูงสุดท้าย)
- เส้นขอบ 1px จะต้องเพิ่มเติมจากขนาดไฟล์ฐานที่ต้องการ อิมเมจ 100x100 9-patch จะต้องมี 102x102 (100x100 + 1px ที่ด้านบนด้านล่างซ้ายและขวา)
- รูปภาพ 9 แผ่นต้องลงท้ายด้วย * .9.png
ดังนั้นคุณสามารถวาง 1 จุดที่ด้านใดด้านหนึ่งของโลโก้ของคุณ (ในขอบด้านบน) และ 1 จุดด้านบนและด้านล่าง (บนขอบด้านซ้าย) และแถวและคอลัมน์ที่ทำเครื่องหมายเหล่านี้จะเป็นพิกเซลเดียวที่จะยืด
ตัวอย่าง
นี่คือภาพ 9 แผ่น, 102x102px (ขนาดสุดท้าย 100x100 สำหรับจุดประสงค์ของแอป):
นี่คือการซูม 200% ของภาพเดียวกัน:
สังเกตเห็นเครื่องหมาย 1px ที่ด้านบนและด้านซ้ายว่าแถว / คอลัมน์ใดที่จะขยาย
นี่คือภาพที่ปรากฏใน 100x100 ภายในแอป:
และนี่คือสิ่งที่มันต้องการหากขยายเป็น 460x140:
สิ่งสุดท้ายที่ต้องพิจารณา ภาพเหล่านี้อาจดูดีบนหน้าจอมอนิเตอร์และโทรศัพท์มือถือส่วนใหญ่ แต่หากอุปกรณ์มีความหนาแน่นของภาพสูงมาก (dpi) ภาพจะดูเล็กเกินไป อาจยังคงชัดเจน แต่บนแท็บเล็ตที่มีความละเอียด 1920x1200 ภาพจะปรากฏเป็นสี่เหลี่ยมเล็ก ๆ กลาง ดังนั้นทางออกคืออะไร? ออกแบบอิมเมจ 9 แพตช์ที่แตกต่างกัน 4 แบบแต่ละชุดมีความหนาแน่นแตกต่างกัน เพื่อให้แน่ใจว่าจะไม่มีการหดตัวเกิดขึ้นคุณควรออกแบบด้วยความละเอียดที่ต่ำที่สุดสำหรับแต่ละประเภทความหนาแน่น การลดขนาดเป็นสิ่งที่ไม่พึงประสงค์ที่นี่เนื่องจาก 9-patch บัญชีเท่านั้นสำหรับการยืดดังนั้นในการย่อตัวข้อความขนาดเล็กและองค์ประกอบอื่น ๆ อาจสูญเสียความชัดเจน
นี่คือรายการการแก้ปัญหาที่เล็กที่สุดและพบบ่อยที่สุดสำหรับแต่ละประเภทความหนาแน่น:
- xlarge (xhdpi): 640x960
- ใหญ่ (hdpi): 480x800
- ปานกลาง (mdpi): 320x480
- ขนาดเล็ก (ldpi): 240x320
ดังนั้นออกแบบหน้าจอสาดสี่หน้าในความละเอียดด้านบนขยายภาพวางกรอบโปร่งใสขนาด 1px รอบ ๆ ผืนผ้าใบและทำเครื่องหมายว่าแถว / คอลัมน์ใดที่จะยืดหยุ่นได้ โปรดจำไว้ว่าภาพเหล่านี้จะใช้สำหรับอุปกรณ์ใด ๆในหมวดหมู่ความหนาแน่นดังนั้นภาพ ldpi ของคุณ (240 x 320) อาจขยายเป็น 1024x600 บนแท็บเล็ตขนาดใหญ่พิเศษที่มีความหนาแน่นของภาพขนาดเล็ก (~ 120 dpi) ดังนั้น 9-patch เป็นทางออกที่ดีที่สุดสำหรับการยืดตราบใดที่คุณไม่ต้องการรูปถ่ายหรือกราฟิกที่ซับซ้อนสำหรับหน้าจอเริ่มต้น (จำข้อ จำกัด เหล่านี้เมื่อคุณสร้างการออกแบบ)
อีกวิธีเดียวที่จะทำให้สิ่งนี้ไม่เกิดขึ้นคือการออกแบบหน้าจอเดียวสำหรับแต่ละความละเอียด (หรืออีกภาพหนึ่งสำหรับการรวมกันของความละเอียดของความละเอียดถ้าคุณต้องการหลีกเลี่ยงภาพที่เล็กเกินไป / ใหญ่เกินไปสำหรับอุปกรณ์ที่มีความหนาแน่นสูง / ต่ำ) ภาพไม่ยืดและมีสีพื้นหลังปรากฏขึ้นไม่ว่าจะเกิดการยืดออก (โปรดจำไว้ว่าสีที่แสดงโดยเครื่องมือ Android อาจดูแตกต่างจากสีเฉพาะที่แสดงโดยโฟโต้ช็อปเนื่องจากโปรไฟล์สี)
ฉันหวังว่านี่จะสมเหตุสมผล โชคดี!