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


123

有什么方法可以将LayoutParams的高度/宽度设置为与密度无关的像素(dp)?以编程方式设置时,高度/宽度以像素为单位,而不是dp。

Answers:


271

您需要将DIP值转换为像素:

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

对我来说,这就是窍门。


10
我认为getActivity()。getResources()。getDimension(resourceID)可以执行正确的转换操作。
StErMi 2012年

3
对我有用,但是不同...如果我使用上述方法与使用xml设置ImageView的宽度/高度。在XML中,我设置了85dp,而上述方法需要“ 75”才能产生相同的大小。知道为什么吗?
德克2014年

1
@Dirk以编程方式设置时,可能存在填充/边距问题(通常,在代码中进行设置时,您必须自己指定填充)。在XML或代码中设置dp之间应该没有任何区别。
Tiago

11
 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);

那是真的。您已硬编码为仅支持固定数量的密度。如果要按密度比例因子进行比例缩放,只需乘以developer.android.com/reference/android/util/…,这也将与(size * metrics.densityDpi)/ DisplayMetrics.DENSITY_DEFAULT相同。
hackbod 2011年

1
是的,您的新答案是合理的。或就像我说的,乘以metrics.density。那就是它的目的。
hackbod 2011年

6

由于可以多次使用:

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;
}

5

这是我的代码段:

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()


0

回答的解决方案对我不起作用,视图的高度仍处于关闭状态。我结束了,这很好用:

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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.