Android能否支持小于1dp的dp单位?

46

我正在制作一个日历,需要一个网格。问题是边框或者说每个网格之间的空间,我使用它来模拟网格,但它很粗。我看了其他有边框的日历应用程序,它们非常细。即使我使用 drawable 形状并将其设置为1dp,它仍然很厚。我尝试使用0.5,但似乎不起作用。这不可能吗?

4个回答

66

虽然Android允许您在XML中输入小数值的dp,但我不确定是否建议这样做,因为结果变得不那么容易预测/计算。设备使用以下公式(基本上)将dp值转换为像素:

px = (int)(scale * dp + 0.5)

(即设备密度比例四舍五入为最近的整像素值)

scale值将基于设备的屏幕密度:

  • MDPI = 1
  • HDPI = 1.5
  • XHDPI = 2
  • XXHDPI = 3

因此,0.5dp会在上述密度下结果为{1px, 1px, 1px, 2px},而1dp则为{1px, 2px, 2px, 3px}。 像0.1dp这样微小的值将解析为{1px, 1px, 1px, 1px},因为上述公式中小于1的任何值都将解析为单个像素,除非该值明确设置为0dp(无法绘制比单个像素宽度更细的东西)。

如果要确保使用最细的可能宽度,最好用px明确定义宽度,而不是使用缩放单位如dp。 将值设置为1px将在所有设备上绘制单个像素,并且比希望0.5dp0.1dp产生相同效果可读性更高。


px是一个很好的想法——允许每个设备将其调整得尽可能精细。谢谢! - SMBiggs

9

是的。

我设置为0.1dp,在我的4英寸ME860 DRIOD上比1dp还要小。


似乎取决于设备。我将边框设置为0.5dp,在我的Nexus 4上显示,但在第一代Kindle上没有显示。 - Sam

3
简单的答案是可以。
解决您的问题(即实现最细的线条),将粗细设置为:1px。我建议使用像素(px)作为单位,因为它不依赖于设备并且是可用的最小度量。此外,它不会被转换成其他形式,因此没有舍入误差或意外渲染...让我解释一下。
Android布局xml文件或尺寸xml值文件允许您输入dp的小数值。
然而:
我已经在许多设备上尝试了0.1dp到1dp之间的几个值。根据设备,它可能不会按照您的期望进行渲染。
在像素密度较低的设备上,即使它们编码相同,线条也可能在一个侧面比另一个侧面更厚...这是因为当将dp转换为px值进行截断时引入的不准确性 - (如Devunwired所提到的)。
px = (int)(scale * dp + 0.5)

像素(px)是最小的单位,必须是整数。因此,如果您的目标仅仅是希望获得最小可能的线条/边框,则为其设置:

1px

希望这能有所帮助!


0

让颜色变浅。这样看起来就不那么厚重了。


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