ฟังก์ชัน Android View.setPadding(int left, int top, int right, int bottom)
ยอมรับเฉพาะค่าเป็น px แต่ฉันต้องการตั้งค่าช่องว่างในหน่วย dp มีวิธีใดบ้าง?
ฟังก์ชัน Android View.setPadding(int left, int top, int right, int bottom)
ยอมรับเฉพาะค่าเป็น px แต่ฉันต้องการตั้งค่าช่องว่างในหน่วย dp มีวิธีใดบ้าง?
คำตอบ:
ตรงไปที่รหัส
int padding_in_dp = 6; // 6 dps
final float scale = getResources().getDisplayMetrics().density;
int padding_in_px = (int) (padding_in_dp * scale + 0.5f);
getResources()
เป็นฟังก์ชันที่สืบทอดมาจากกิจกรรม แต่ฉันกำลังพยายามใช้บรรทัดเหล่านี้ในอะแดปเตอร์ listview ที่กำหนดเอง มีวิธีใดบ้างที่ฉันสามารถทำได้หากโทรgetResources()
ไม่ได้
หากคุณกำหนดมิติข้อมูล (เป็น dp หรืออะไรก็ได้) ในไฟล์ XML (ซึ่งดีกว่าอย่างไรก็ตามอย่างน้อยก็ในกรณีส่วนใหญ่) คุณจะได้รับค่าพิกเซลของมันโดยใช้รหัสนี้:
context.getResources().getDimensionPixelSize(R.dimen.your_dimension_name)
มีวิธีที่ดีกว่าในการแปลงค่าเป็น dp โดยทางโปรแกรม:
int value = 200;
int dpValue = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
value,
context.getResources().getDisplayMetrics());
จากนั้นนำdpValue
ไปใช้กับวิธีการของคุณตัวอย่างเช่น:setPadding(dpValue,dpValue,dpValue,dpValue);
คุณสามารถคำนวณพิกเซลสำหรับค่า DPI เฉพาะ: http://forum.xda-developers.com/showpost.php?p=6284958&postcount=31
ฉันมีปัญหาเดียวกัน ทางออกเดียวที่ฉันพบ (มันจะช่วยคุณไม่ได้จริงๆ :)) คือตั้งค่าในไฟล์ Xml
หากคุณสามารถรับความหนาแน่นจากโค้ดคุณสามารถใช้การแปลง: "การแปลงหน่วยจุ่มเป็นพิกเซลหน้าจอทำได้ง่าย: pixels = dips * (ความหนาแน่น / 160)" (จากhttp://developer.android.com/guide/practices/screens_support.html )
แก้ไข: คุณจะได้รับความหนาแน่นของหน้าจอ: http://developer.android.com/reference/android/util/DisplayMetrics.html#densityDpi
นี่คือเวอร์ชัน Kotlin ตามคำตอบที่ยอมรับ:
fun dpToPx(dp: Int): Int {
val scale = resources.displayMetrics.density
return (dp * scale + 0.5f).toInt()
}