setWidth(int pixel)是否使用dip或px?


Answers:


221

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

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

64
您还可以调用nbDips * getResources()。getDisplayMetrics()。density
Romain Guy 2010年

9
实际上,这正是TypedValue.applyDimension()所做的。我考虑过发布,但是我喜欢浏览API以防万一发生任何变化……尽管我认为如果可以的话,使用该方法是安全的。:)
丹·卢

12
applyDimension()版本执行更多的代码,我发现它更难阅读。FWIW,我发布的内容是我们在框架和标准应用程序中实际使用的所有内容。
罗曼·盖伊

1
嗨,我尝试了上述两个示例,它似乎无法正确计算像素。相反,它返回的是我在视图中指定的确切值:对于我来说,是android:layout_width =“ 50dip”。它将向我返回xml文件中的确切值50。然后,我在应用程序中对此进行了检查,并按预期的那样,该值是不正确的,并且将该视图绘制得比预期的大
Jonathan

我发现px到pt转换的唯一解决方案,非常好。
A-Live

24

在代码中获取恒定数量的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));

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


在我的情况下,此解决方案在我有一个具有列表视图的自定义对话框并且希望将Header Labels和ListView中的列的宽度设置为相同宽度的情况下效果最佳。
韦恩·菲普斯

您的第一句话有点好笑,您基本上是在说创建XML文件是“在代码中指定[内容]”的正确方法。好吧,我认为您只是在代码中使用常数而不指定它:)
Joffrey

@Joffrey是的,我明白您的意思了,所以我对措辞做了些微更新
SDJMcHattie 2014年

7

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


0

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


1
如果它在布局xml文件中,我们可以指定android:layout_width =“ 100dip”或android:layout_width =“ 100px”。在源代码中,我们不能将布局的宽度指定为100dip?
user256239 2010年

不直接,您必须使用DisplayMetrics.density进行转换。
罗曼·盖伊

0

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

   // 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());
    }
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.