以编程方式将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; }