为什么dpToPixel不应该用于设置布局尺寸?

时间:2015-05-18 10:08:54

标签: android android-layout

为什么在XXX_active(声明为here)的javadocs中声明它不应该用于设置布局尺寸?

2 个答案:

答案 0 :(得分:4)

我们不使用像素来定义布局尺寸。使用密度独立像素可确保在各种设备上正确布局尺寸。意思是所说的布局在4英寸手机和7英寸平板电脑上具有大致相同的视觉尺寸。 (这与手头的问题完全无关:))

据说实际的布局大小(例如LayoutParams类)实际上是使用整个像素来定义结果大小。以这种方式使用dpToPixels方法是可行的:

float px = dpToPixels(16, getResources()); // 16 dp to pixels precise
int pxOffset = (int) px; // 16dp rounded down to whole pixels
int pxSize = (int) (0.5f + px); // 16dp rounded up to whole pixels

现在你可以在布局中使用这些值, pxOffset用于填充,边距等(可以为零)和pxSize用于宽度和高度(确保至少1px大小,除非为零) 即可。使用适用于布局的方法int Resources.getDimensionPixelOffset(int)int Resources.getDimensionPixelSize(int)以及适合精确绘制的float Resources.getDimension(int)时,可以进行相同的计算。

修改

高程使用float值,因此使用精确尺寸完全没问题。

TranslationX,translationY或translationZ是使用float值定义的。这些和更多视图属性用于动画,因此使用平滑值是有意义的。如果手动设置,则使用整数来表示可预测的行为。

答案 1 :(得分:1)

px 像素 - 每个比例的点数对应于屏幕上的实际像素。

dp 与密度无关的像素 - 基于屏幕物理密度的抽象单位。这些单位相对于160 dpi的屏幕,因此一个dp是160 dpi屏幕上的一个像素。 dp与像素的比率将随着屏幕密度而变化,但不一定成正比。注意:编译器同时接受" dip"和" dp",虽然" dp"更符合" sp"。

对于1920 * 1080,1440 * 960的屏幕,很容易理解px是什么......但density中有Android概念。

**px = density*density**

作为Android开发人员,我们都知道Android Fragmentation Problem。 Google建议我们使用dip来布局我们的观看,而不是px。但有时我们必须使用px。所以,我们需要这种转换。

PS:PXDP不同但相似。

当您仅考虑屏幕的物理尺寸时,

DP是分辨率。当您使用DP时,它会将您的布局缩放到具有不同pixel密度的其他类似大小的屏幕。

有时你实际上想要pixel,当你处理代码中的维度时,你总是处理真实的像素,除非你转换它们。

所以在Android设备上,正常大小的hdpi屏幕,800x480在DP中是533x320(我相信)。要将DP转换为像素/1.5,要转换回* 1.5。这仅适用于一个屏幕尺寸和dpi,它会根据设计而改变。我们的艺术家给了我像素,然后用上面的1.5等式转换成DP。