SetPadd 只接受 px 格式,是否存在在 dp 格式的 setPadd?

Android 函数 View.setPadding(int left, int top, int right, int bottom)只接受 px 值,但我希望设置 dp 的填充。还有别的办法吗?

41514 次浏览

You can calculate the pixels for a specific DPI value: http://forum.xda-developers.com/showpost.php?p=6284958&postcount=31

I've the same problem. The only solution i've found (it will not really help you :) ) is to set it in the Xml file.

If you can get the density from the code, you can use the convertion: "The conversion of dip units to screen pixels is simple: pixels = dips * (density / 160)." (from http://developer.android.com/guide/practices/screens_support.html )

Edit: you can get the screen density: http://developer.android.com/reference/android/util/DisplayMetrics.html#densityDpi

Straight to code

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

If you define the dimension (in dp or whatever) in an XML file (which is better anyway, at least in most cases), you can get the pixel value of it using this code:

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

There is a better way to convert value to dp programmatically:

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

Then apply dpValue to your method, for example: setPadding(dpValue,dpValue,dpValue,dpValue);

Here's Kotlin version based on accepted answer:

fun dpToPx(dp: Int): Int {
val scale = resources.displayMetrics.density
return (dp * scale + 0.5f).toInt()
}