设置宽度(以像素为单位)是不是使用 dp 或 px?

Posted

技术标签:

【中文标题】设置宽度(以像素为单位)是不是使用 dp 或 px?【英文标题】:Does setWidth(int pixels) use dip or px?设置宽度(以像素为单位)是否使用 dp 或 px? 【发布时间】:2011-01-25 06:34:58 【问题描述】:

setWidth(int pixel) 是使用与设备无关的像素还是物理像素作为单位? 例如,setWidth(100) 是否将视图的宽度设置为 100 dips 或 100 pxs?

谢谢。

【问题讨论】:

【参考方案1】:

它使用像素,但我确定您想知道如何使用 dips 代替。答案在TypedValue.applyDimension()。下面是如何在代码中将 dips 转换为 px 的示例:

// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));

【讨论】:

也可以调用nbDips * getResources().getDisplayMetrics().density 事实上,这正是 TypedValue.applyDimension() 所做的。我考虑过发布它,但我喜欢通过 API 以防万一发生任何变化……尽管我想如果你同意的话,使用该方法是安全的。 :) applyDimension() 版本执行更多代码,我发现它更难阅读。 FWIW,我发布的这句话是我们在框架和标准应用程序中实际使用的。 您好,我尝试了以上两个示例,但似乎没有正确计算像素。相反,它返回我在我的视图中指定的确切值: android:layout_ 在我的例子中。它将返回 50 xml 文件中的确切值。然后我在应用程序中检查了这一点,正如预期的那样,该值不正确,并且绘制的视图比预期的太大 我找到的唯一一个 px 到 pt 转换的解决方案,非常好。【参考方案2】:

在代码中获取恒定数量的 DIP 的正确方法是创建一个包含 dp 值的资源 XML 文件,有点像:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="image_width">100dp</dimen>
    <dimen name="image_height">75dp</dimen>
</resources>

然后像这样引用代码中的资源:

float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));

您返回的浮点数将根据设备的像素密度进行相应缩放,因此您无需在整个应用程序中不断复制转换方法。

【讨论】:

你的第一句话有点好笑,你基本上是在说创建一个 XML 文件是“在代码中指定 [something]” 的正确方法。好吧,我认为您只是在代码中使用常量而不是指定它:) @Joffrey 是的,我明白你的意思,所以我稍微更新了措辞【参考方案3】:

方法 setWidth(100),将 100 px 设置为宽度(不在 dp 中)。因此您可能会在不同的 android 手机上遇到宽度变化的问题。所以使用 dp 中的测量值而不是像素值。使用下面的代码以 dp 获取测量值样本宽度=300px,高度=400px。

int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());

int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());

【讨论】:

【参考方案4】:
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;

Source (@Romain Guy)

【讨论】:

【参考方案5】:

根据上面对我来说很好的答案,我生成了一些辅助方法,只需将它们添加到您的实用程序中即可在整个项目中使用它们。

   // value in DP
   public static int getValueInDP(Context context, int value)
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    

    public static float getValueInDP(Context context, float value)
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    

    // value in PX
    public static int getValueInPixel(Context context, int value)
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    

    public static float getValueInPixel(Context context, float value)
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    

【讨论】:

从上面的答案,我想你可能已经颠倒了 px 和 dp 方法。例如,如果您考虑接受的答案,它的代码与您的第一个方法完全相同,但在答案中,它应该返回 PX 中的值,而不是 DP 中的值,就像您的代码中那样。 (我想编辑,但 SO 告诉我“建议的编辑队列已满”...) @V4karian 嘿,感谢您的评论,但我想让您知道的是,我已经为 DP 和 Pixel 添加了方法,根据您可以使用其中任何一种的要求。【参考方案6】:

当然是像素,该方法要求像素作为参数。

【讨论】:

如果是布局xml文件,我们可以指定android:layout_或者android:layout_。源码中不能指定一个布局的宽度为100dip? 不是直接的,你必须使用 DisplayMetrics.density 转换自己。【参考方案7】:

将像素转换为 dp 的 Kotlin 扩展函数

fun Context.pxToDp(value: Float):Int
    val r: Resources = resources
    return TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP, value, r.displayMetrics
    ).roundToInt()

【讨论】:

以上是关于设置宽度(以像素为单位)是不是使用 dp 或 px?的主要内容,如果未能解决你的问题,请参考以下文章

从样式设置为 % 的元素获取宽度(以像素为单位)?

getMeasuredHeight() 是不是以像素或 dp 为单位返回值

根据开发人员使用 CSS 指定的内容,是不是可以使用 jQuery 以百分比或像素为单位获取元素的宽度?

CSS宽度以%为单位,高度以px为单位,长度相同[重复]

将像素转换为 dp

将像素转换为 dp