将Android中的dip转换为px

54

我写了一个从dip中获取像素的方法,但是它不起作用。它给了我一个运行时错误。

实际上,我将这个方法运行在一个独立的类中,并在我的Activity类中初始化。

Board board = new Board(this);
board.execute(URL);

这段代码是异步运行的。请帮忙。

public float getpixels(int dp){
    //Resources r = boardContext.getResources();
    //float px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpis, r.getDisplayMetrics());
        
    final float scale = this.boardContext.getResources().getDisplayMetrics().density;
    int px = (int) (dp * scale + 0.5f);

    return px;
}

你遇到了什么错误?boardContext 是 null 吗?getResources 是 null 吗? - Sulthan
4个回答

139
尝试这个:
Java
public static float dipToPixels(Context context, float dipValue) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, metrics);
}

Kotlin

fun Context.dipToPixels(dipValue: Float) =
    TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, resources.displayMetrics)

6
你会返回像素的浮点数吗?难道不应该转换为整数类型吗? - hjchin
可以工作,但似乎将w、h应用于我的浮动活动时,Android会在右侧和左侧各添加16dp(共32dp),因此我必须传递的dipValue是我在布局xml中设置的dipValue + 32dp,这样就解决了。 - Mercury

43

您可以在dimen.xml文件中添加dp值并使用。

int pixels = getResources().getDimensionPixelSize(R.dimen.idDimension);

这样做起来更简单...


23

公式为:px = dp * (dpi / 160),适用于160 dpi的屏幕。请查看将dp单位转换为像素单位获取更多信息。

你可以尝试:

public static int convertDipToPixels(float dips) {
    return (int) (dips * appContext.getResources().getDisplayMetrics().density + 0.5f);
}

希望这可以帮到你...


8
尝试以下代码,不需要传递上下文:
 public static float dipToPixels(float dipValue) {
     return TypedValue.applyDimension(
         TypedValue.COMPLEX_UNIT_DIP,
         dipValue,
         Resources.getSystem().getDisplayMetrics()
     );
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接