如何在Android程序中以编程方式从像素计算dp

141

我想通过编程来计算pxdp的转换。怎样实现呢? 我从以下位置获取分辨率:

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
ht = displaymetrics.heightPixels;
wt = displaymetrics.widthPixels;

你知道屏幕的物理尺寸吗?例如直径为7英寸。 - Christian Kuetbach
1
当某个内容被标记为重复时,但重复通知中未附带重复内容的链接时,这会让人感到非常烦人。 - Brill Pappin
4个回答

399

这里所有的答案都展示了dp->px转换而不是OP所要求的px->dp转换。 请注意,TypedValue.applyDimension无法用于将px转换为dp,对此,您必须使用以下描述的方法:https://dev59.com/MW445IYBdhLWcg3w_O8m#17880012 (下面为方便起见引用)。

fun Context.dpToPx(dp: Int): Int {
    return (dp * resources.displayMetrics.density).toInt()
}

fun Context.pxToDp(px: Int): Int {
    return (px / resources.displayMetrics.density).toInt()
}

50
这应该被接受为答案。 - Goldorak84
1
这绝对是我找到的关于这个问题最好的答案。它可以在任何类中使用。 - user3290180
1
这是正确的答案:return px / (context.getResources().getDisplayMetrics().densityDpi / 160f) - android developer
2
使用 Kotlin 的 toInt() 方法而不是强制转换。 - kike
1
@androiddeveloper,请解释一下为什么您认为使用densityDpi比density更好。 - Ayaz Alifov
显示剩余4条评论

55
float ht_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ht, getResources().getDisplayMetrics());
float wt_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, wt, getResources().getDisplayMetrics());

19
这个问题涉及到“px -> dp”,但代码中看起来是“dp -> px”?(请注意LHS中的“_px”后缀) - Palani
这是从问题的相反方向进行转换。 - Jerry Destremps
3
你能否将第一个参数从TypedValue.COMPLEX_UNIT_DIP更改为TypedValue.COMPLEX_UNIT_PX,以将dp -> px进行转换? - DeltaCap019

39

这应该可以给你转换像素-> dp:

DisplayMetrics displaymetrics = new DisplayMetrics();
int dp = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, myPixels, displaymetrics );

48
你正在进行 dp 到 px 的转换。TypedValue.applyDimension 的文档说明第一个参数是要从中转换的单位,返回值是“根据其单位乘以相应度量的复杂浮点数值”。applyDimension 不能用于将 px 转换为 dp,对此你必须按照这里描述的方式进行转换:https://dev59.com/MW445IYBdhLWcg3w_O8m#17880012 - Vicky Chijwani
1
有趣!虽然这不是真正的答案,但仍然很有用。 - Farshad Tahmasbi

2
DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        String str_ScreenSize = "The Android Screen is: "
                    + dm.widthPixels
                    + " x "
                    + dm.heightPixels;

        TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize);
        mScreenSize.setText(str_ScreenSize);

您能检查一下吗?

或者这也可能会对您有所帮助

int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
                     (float) 123.4, getResources().getDisplayMetrics());

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