Nexus 7 和 Kindle Fire HD,想法不同

Posted

技术标签:

【中文标题】Nexus 7 和 Kindle Fire HD,想法不同【英文标题】:Nexus 7 and Kindle Fire HD, think different 【发布时间】:2012-10-20 19:20:09 【问题描述】:

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

这似乎是因为 nexus 7 被检测为 TVDPI,而 Kindle Fire HD 是 HDPI。 如何在 1280 * 800 模型的基础上进行相同的渲染?

谢谢

【问题讨论】:

有趣,您能否向我们提供显示差异的 SS(我知道这可能很难,因为您正在开发项目)? Nexus7 是否按照默认布局显示应用? Ed Burnette 谈到了关于 TVDPI 分辨率的问题,特别是 Nexus7。我猜 Nexus 正在使用默认布局。 为了帮助您,我们需要确切地知道“看起来有什么不同”。 布局在 layout-sw530dp 结果:docs.google.com/open?id=0B8242osqx3OrUXhlbENRTXhOcWM Nexus7其实用的是layout-sw600dp,但是Kindle Fire HD 7"没有用,不知道用的是哪个.. 【参考方案1】:

嗯,看来你已经发现了为什么两者有差异,因为它们报告了不同的密度比例因子:

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

那么,当它们在技术上具有相同的物理尺寸和分辨率时,为什么它们会报告不同的结果呢?

CORE 问题确实存在,因为一台设备是 Google Play 设备 (Nexus),而另一台不是 (Kindle)。所有具有 Google Play(和其他 Google 应用程序)的 android 设备只能通过称为兼容性测试套件 (CTS) 的东西来做到这一点,该套件会验证此类设置是否符合他们提出的标准。标准本身记录在每个版本的兼容性定义文档 (CDD) 中。 Here is a link to the CDD for Android 4.0(第 7.1 节涉及屏幕尺寸和密度)。 CDD 告诉设备制造商他们应该报告数字上最接近屏幕实际 DPI 的比例因子,在这种情况下实际上是 TVDPI。

亚马逊设备不使用任何 Google 应用程序,包括 Google Play。虽然遵循相同的标准可能符合他们的最大利益,但他们不受这些标准的约束,而且通常不被遵循。 TVDPI 出现在 Nexus 7 上时,几乎所有人都知道了,但如果亚马逊在设计时引用了 CDD,就会知道这一点。

这如何导致他们表现不同?

差异不在您的布局选择中。显然,从您的屏幕截图中,这两种设备都按照您的预期选择了正确的布局。更改布局目录上的sw 值只会影响哪些设备将选择该布局......它不会改变任何关于如何缩放的东西。不要费心尝试将布局本身放置在特定于密度的目录中......布局应该是灵活的。

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

由于这两种设备选择以不同方式缩放资源,因此您使用的任何可绘制资源或您在“dp”中定义的任何值都会导致微小的变化。让我举两个例子:

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

可绘制图像也是如此。如果你只在drawable-mdpi中定义了一个48x48的图像,而在drawable-hdpi中定义了一个72x72的相同图像,Kindle有一个72px的图像可以直接使用,而Nexus会创建一个比例为64px的图像,所以有8个像素的差异两个资产之间。

怎样做才能让两者看起来更相似?

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

但是,一般来说,如果您的 UI 的某些部分需要为此专门更改,则解决方案是为您认为需要它们的 -tvdpi 案例定义特定的资源和维度(同样,我不会'不建议在您的应用中扩展所有内容以满足这种情况)。

对于文本或视图大小等内容,这意味着您可能需要一个values-tvdpi/dimensions.xml 文件和一个默认的values/dimensions.xml 文件。使用上面的示例,您可以将默认文本大小定义为 16dp,但在 -tvdpi 位置,定义与 18dp 相同的尺寸。这将导致两个设备将最终文本缩放到 24 像素。在使用实际尺寸的代码中,将其直接引用为@dimen/myTextSize 而不是16dp

对于可绘制项目,添加一个 drawable-tvdpi 目录并缩放这些资源以匹配您认为它们应该在 Nexus 7 等设备上绘制的方式。再次使用我们之前的示例,将相同的图像文件从 drawable-hdpi 文件夹复制到drawable-tvdpi 文件夹,因此两个设备将在 72 像素处绘制相同的图像。

为避免在多个位置复制相同的资产,您还可以使用别名来执行此操作。将图像本身放入具有特殊名称的drawable/,并使用values-tvdpi/drawables.xmlvalues-hdpi/drawables.xml 在两个地方引用单个资产。有关别名的更多信息,see this documentation。这些示例适用于布局,但同样的范例也适用于可绘制对象(或任何资源),只需更改为 type="drawable"

【讨论】:

这是一个很好的答案,我要补充的一个警告是,基于密度的混叠只是一种临时修复。当一款符合 CDD 且真正为 HDPI 的平板电脑问世时,上述所有内容都会中断。这与我们使用 Galaxy Tab 7" 时遇到的情况相同。当它实际上是 MDPI 时,它报告为 HDPI。每个人都使用别名使其工作,但是当 Nexus 7" 出现时,所有的黑客都暴露了,大多数公司不得不放弃支持 Tab 7" 以支持新的更高分辨率设备系列。目前我倾向于使用 -sw533dp 的新布局,但我仍然不满意。【参考方案2】:

因为 Nexus7 是 tvdpi 设备,它使用 layout-sw600dp 资源(基于 213dpi 计算),FireHD 是 HDPI 设备并最终使用 layout-sw533dp 资源(基于 240dpi 计算)

【讨论】:

为什么?密度按像素/英寸计算。两个设备具有相同的分辨率,两个设备具有相同的显示尺寸。那么为什么会有密度差异呢?【参考方案3】:

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

【讨论】:

以上是关于Nexus 7 和 Kindle Fire HD,想法不同的主要内容,如果未能解决你的问题,请参考以下文章

谷歌移动广告和 Kindle Fire

检测应用程序正在 Kindle Fire 上运行

Kindle Fire 推送通知示例应用程序

我可以在为 kindle fire 商店发布的应用程序中使用谷歌分析吗?

在 kindle fire 上调试安卓应用

SDK 选项不适用于 Eclipse 中的 Kindle Fire?