有没有办法以密度无关像素(dp)的形式设置LayoutParams的高度/宽度?看起来,当以编程方式设置高度/宽度时,它们是以像素而不是dp为单位的。
你需要将dip值转换为像素:
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 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>
* E.g. to convert 100dp: px = (int) (100 * convRate);
* @param context e.g. activity
* @return conversion rate
*/
public static float convRateDpToPx(Context context) {
return context.getResources().getDisplayMetrics().densityDpi / 160f;
}
这是我的代码片段:
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()
用于获取当前设备的屏幕参数。
对我来说,已回答的解决方案并不能解决问题,视图的高度仍然不准确。最终我采用了如下方法,现在已经很好地解决了:
protected int dp2px(int dp){
final float scale = getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
如果你想要反过来,即从像素到dp...
protected float px2dp(float px){
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
float dp = px / (metrics.densityDpi / 160f);
return Math.round(dp);
}