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

时间:2011-05-11 05:56:13

标签: android android-layout

有没有办法将LayoutParams的高度/宽度设置为与密度无关的像素(dp)?看起来像编程时设置的高度/宽度是以像素为单位而不是dp。

5 个答案:

答案 0 :(得分:265)

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

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

对我而言,这就是诀窍。

答案 1 :(得分:12)

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

答案 2 :(得分: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()

答案 3 :(得分:5)

因为它可以多次使用:

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

答案 4 :(得分: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);
}