Android และการตั้งค่าความกว้างและความสูงโดยทางโปรแกรมในหน่วย dp


304

ฉันกำลังทำ:

button.setLayoutParams(new GridView.LayoutParams(65, 65));

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

คำตอบ:


541

คุณจะต้องแปลงจาก dps เป็นพิกเซลโดยใช้ขนาดตัวคูณการแสดงผล

final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);

111
การแปลงที่ถูกต้องคือ (int) (dps * scale + 0.5f) นี่คือสูตรที่เราใช้ตลอดทั้งเฟรมเวิร์ก
Romain Guy

8
สูตรอยู่ในเอกสาร สำหรับการอ่านเพิ่มเติมไปที่ส่วนที่ 3 ของdeveloper.android.com/guide/practices/…
SK9

34
@RomainGuy คุณสามารถโปรดเพิ่มฟังก์ชั่นโปรแกรมที่จะ API เพื่อแปลงจากdpไปpx? ขอบคุณ
AlikElzin-kilaka

3
dps ที่นี่คืออะไร ฉันได้รับข้อผิดพลาด "dps ไม่สามารถแก้ไขเป็นตัวแปร" ได้หรือไม่ ประเภท "dps" จำเป็นต้องประกาศว่าอย่างไร
Deepak

5
ตัวแปร "dps" คือค่าอินพุตที่คุณต้องการแปลง
Robby Pond

233

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันได้พบวิธีการแปลงที่สั้นกว่ามากแล้ว

ชวา

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());

Kotlin

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)

8
ทำได้ดีมากสำหรับการค้นหาวิธีการทำเช่นนี้ ฉันไม่ใช่แฟนตัวยงของการทำซ้ำสูตรในหลายแห่ง! ขอบคุณ
darrenp

2
ถ้าไม่เช่นนั้นให้สร้างฟังก์ชั่นด้วยสูตร
Sayka

1
@ Kenobi มันแปลงให้คุณจาก DP เป็น PX 65ข้างต้นเป็นค่า DP คุณต้องการแปลง PX
drspaceboo

7
นี่ควรเป็นคำตอบที่ยอมรับไม่ใช่ตัวเลขปัจจุบันที่ตัวเลขเหล่านี้ (0.5) มาอย่างน่าอัศจรรย์จากที่ใด
Johny19 19

1
@ Johny19 0.5 ไม่ใช่เวทมนตร์ มันเป็นแค่วิธีการปัดเลขทศนิยมให้เป็นจำนวนเต็มที่ใกล้ที่สุดแทนที่จะตัดมัน ดูความคิดเห็นของฉันเกี่ยวกับคำตอบของ Robby Pond สำหรับรายละเอียดเพิ่มเติม
MarredCheese

38

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

final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);

และ dimens.xml ของคุณจะมี:

<dimen name="dimen_entry_in_dp">72dp</dimen>

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


โปรดทราบว่าค่าที่ส่งคืนนั้นเป็น int จริงดังนั้นมันจึงถูกส่งไปยังการลอย
CorayThan

นี่เป็นคำตอบที่ไม่ดีเพราะมันเป็นค่าใช้จ่ายที่มีชีวิตชีวา
Johny19

37

วิธีที่ง่ายที่สุด (และใช้งานได้จาก api 1) ที่ทดสอบคือ:

getResources().getDimensionPixelSize(R.dimen.example_dimen);

จากเอกสาร:

ดึงส่วนข้อมูลสำหรับ ID ทรัพยากรเฉพาะเพื่อใช้เป็นขนาดพิกเซลแบบดิบ นี่เหมือนกับ getDimension (int) ยกเว้นค่าที่ส่งคืนจะถูกแปลงเป็นพิกเซลจำนวนเต็มเพื่อใช้เป็นขนาด การแปลงขนาดเกี่ยวข้องกับการปัดเศษค่าฐานและทำให้แน่ใจว่าค่าฐานที่ไม่เป็นศูนย์มีขนาดอย่างน้อยหนึ่งพิกเซล

ใช่มันจะปัดเศษค่า แต่ก็ไม่ได้แย่มาก (ในค่าคี่บนอุปกรณ์ hdpi และ ldpi ต้องเพิ่มค่าเล็กน้อยเมื่อ ldpi ไม่ธรรมดามาก) ฉันทดสอบในอุปกรณ์ xxhdpi ที่แปลง 4dp เป็น 16 (พิกเซล) และนั่นคือ จริง

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