Nexus 7和Kindle Fire HD,认为不同

我正在开发平板电脑7英寸Kindle Fire HD和Nexus 7的应用程序。 这两个应用程序具有相同的大小和相同的屏幕分辨率。 但是,我运行我的应用程序,这是非常不同的。 为什么?

这似乎是因为nexus 7被检测为TVDPI,并且Kindle Fire HD是HDPI。 如何基于1280 * 800型号进行相同的渲染?

谢谢

那么,你已经发现了这两者之间为什么会有差异,这是因为他们报告了不同的密度比例因子:

  • Nexus 7:TVDPI:比例因子= 1.333
  • Kindle Fire HD:HDPI:比例因子= 1.5

那么为什么他们在技术上具有相同的物理尺寸和分辨率时有不同的报告?

CORE问题确实存在,因为一个设备是Google Play设备(Nexus),另一个不是(Kindle)。 所有拥有Google Play(以及其他Google应用)的Android设备只能通过传递一个名为兼容性testing套件(CTS)的testing套件(CTS)来validation这些设置是否符合他们提出的标准。 标准本身logging在每个版本的兼容性定义文档(CDD)中。 这里是Android 4.0的CDD的链接 (第7.1节涉及屏幕大小和密度)。 CDD告诉设备制造商他们应该报告数字上最靠近屏幕实际DPI的比例因子,在这种情况下实际上是TVDPI。

Amazon设备不使用任何Google应用程序,包括Google Play。 遵循同样的标准对他们来说是最符合他们利益的,但他们并不受他们的约束,往往不被遵守。 当Nexus 7出现在TVDPI上的时候,TVDPI会吸引所有人,但是如果在devise时引用了CDD,亚马逊就会知道它。

这是如何导致他们行为不同的?

差异不在您的布局select。 很明显,从你的屏幕截图中,两个设备正在按照你的预期来select合适的布局。 在布局目录中更改sw值只影响哪些设备将select该布局…它不会改变任何事情将如何缩放。 不要试图将布局本身放在密度特定的目录中…布局应该是灵活的。

相反,问题在于对与密度无关的像素单元(即dip或dp)进行的任何尺寸或大小计算,例如文本大小,您可能创build的任何固定视图大小以及可绘制大小。

由于这两个设备select了不同的资产比例,因此您使用的任何可绘制资源或您在“dp”中定义的任何值都将导致一个小的变化。 让我举两个例子:

您将TextView的文本大小定义为16dp 。 在Nexus 7上,这将以21px绘制文本。 Kindle Fire HD将以24像素绘制相同的文字。 差别很小,但存在。

对于可绘制的图像也是如此。 如果你只在48×48的drawable-mdpi中定义了一个图像,而在72×72的drawable-hdpi中定义了相同的图像,那么Kindle有72px的图像可以直接使用,而Nexus会创build一个64px的图像,所以有8个像素两个资产之间。

我能做些什么使两者看起来更相似?

在大多数情况下,我会说你不应该。 通常所做的缩放并不会大大影响应用程序的结果,除非布局的约束条件设置了太多的硬编码大小。

但是,一般来说,如果您的UI的某些部分需要专门为此更改,则解决scheme是为-tvdpi情况定义特定的资源和维度,在-tvdpi情况下,您觉得它们是必需的(同样,我不build议按比例缩放一切在你的应用程序来满足这种情况下)。

对于文本或视图大小的情况,这意味着您可能需要一个values-tvdpi/dimensions.xml文件和一个默认values/dimensions.xml文件。 使用上面的示例,可以将默认文本大小定义为16dp,但在-tvdpi位置中,定义与18dp相同的维度。 这将导致两个设备的最终文本扩展到24px。 在代码中使用实际维度的地方,请直接引用它作为@dimen/myTextSize而不是16dp

对于可绘制项目,添加一个drawable-tvdpi目录并缩放这些资源以匹配你认为应该在Nexus 7这样的设备上绘制的方式。再次和前面的例子一样,将同一个图像文件从drawable-hdpi文件夹复制到drawable-tvdpi文件夹,所以这两个设备将在72px绘制相同的图像。

为避免在多个位置复制相同的资产,您也可以使用别名来执行此操作。 将图像本身drawable/drawable/带有特殊名称,并使用values-tvdpi/drawables.xmlvalues-hdpi/drawables.xml引用两个位置的单个资产。 有关别名的更多信息, 请参阅此文档 。 这些例子是用于布局的,但是通过改变type="drawable" ,相同的范例适用于drawable(或任何资源)。

由于Nexus7是一个tvdpi设备,它使用layout-sw600dp资产(基于213dpi的计算),FireHD是一个HDPI设备,最终使用layout-sw533dp资产(基于240dpi的计算)

也许你应该使用layout-tvdpi和layout-hdpi?