以编程方式将LayoutParams上的高度设置为与密度无关的像素

有什么办法将LayoutParams的高度/宽度设置为密度无关像素(dp)? 它看起来像编程设置的高度/宽度是像素而不是dp。

您需要将您的倾angular值转换为像素:

int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics()); 

对我来说这是个诀窍。

  public static int getDPI(int size, DisplayMetrics metrics){ return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT; } 

像这样调用函数,

 DisplayMetrics metrics; metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int heigh = getDPI(height or width, metrics); 

这是我的片段:

 public class DpiUtils { public static int toPixels(int dp, DisplayMetrics metrics) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics); } } 

DisplayMetrics metrics = getResources().getDisplayMetrics()

由于它可能被多次使用:

 public static int convDpToPx(Context context, float dp) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics); } 

我发现使用转换率更实用,因为通常需要转换一个以上的值。 由于转换率不变,所以可以节省一点处理时间。

 /** * Get conversion rate from dp into px.<br> * Eg to convert 100dp: px = (int) (100 * convRate); * @param context eg activity * @return conversion rate */ public static float convRateDpToPx(Context context) { return context.getResources().getDisplayMetrics().densityDpi / 160f; }