View.setPadding ยอมรับเฉพาะใน px มีการ setPadding ใน dp หรือไม่?


96

ฟังก์ชัน Android View.setPadding(int left, int top, int right, int bottom)ยอมรับเฉพาะค่าเป็น px แต่ฉันต้องการตั้งค่าช่องว่างในหน่วย dp มีวิธีใดบ้าง?

คำตอบ:


187

ตรงไปที่รหัส

    int padding_in_dp = 6;  // 6 dps
    final float scale = getResources().getDisplayMetrics().density;
    int padding_in_px = (int) (padding_in_dp * scale + 0.5f);

1
สวัสดีฉันมีคำถาม สูตรนี้ใช้สำหรับช่องว่างภายในเท่านั้นหรืออย่างอื่น? เช่นระยะขอบหรือมิติของรูปสี่เหลี่ยมผืนผ้า?
emeraldhieu

4
นี่คือสูตรสำหรับการแปลงหน่วย DP กับหน่วยพิกเซล คุณสามารถใช้ได้ทุกที่
Labeeb Panampullan

2
ฉันถือว่าgetResources()เป็นฟังก์ชันที่สืบทอดมาจากกิจกรรม แต่ฉันกำลังพยายามใช้บรรทัดเหล่านี้ในอะแดปเตอร์ listview ที่กำหนดเอง มีวิธีใดบ้างที่ฉันสามารถทำได้หากโทรgetResources()ไม่ได้
Mike Baxter

1
จากอะแดปเตอร์ของคุณเพียงแค่ทำ getContext (). getResources (). getDisplayMetrics () ความหนาแน่น;
Steve G.

4
มีคำอธิบายสำหรับ "+ 0.5f" บ้างไหม
Xavier L.

101

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

context.getResources().getDimensionPixelSize(R.dimen.your_dimension_name)

3

มีวิธีที่ดีกว่าในการแปลงค่าเป็น dp โดยทางโปรแกรม:

int value = 200;
int dpValue = (int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP,
            value,        
            context.getResources().getDisplayMetrics());

จากนั้นนำdpValueไปใช้กับวิธีการของคุณตัวอย่างเช่น:setPadding(dpValue,dpValue,dpValue,dpValue);



0

ฉันมีปัญหาเดียวกัน ทางออกเดียวที่ฉันพบ (มันจะช่วยคุณไม่ได้จริงๆ :)) คือตั้งค่าในไฟล์ Xml

หากคุณสามารถรับความหนาแน่นจากโค้ดคุณสามารถใช้การแปลง: "การแปลงหน่วยจุ่มเป็นพิกเซลหน้าจอทำได้ง่าย: pixels = dips * (ความหนาแน่น / 160)" (จากhttp://developer.android.com/guide/practices/screens_support.html )

แก้ไข: คุณจะได้รับความหนาแน่นของหน้าจอ: http://developer.android.com/reference/android/util/DisplayMetrics.html#densityDpi


0

นี่คือเวอร์ชัน Kotlin ตามคำตอบที่ยอมรับ:

fun dpToPx(dp: Int): Int {
    val scale = resources.displayMetrics.density
    return (dp * scale + 0.5f).toInt()
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.