2012-10-31 19 views
15

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

看来这是因为Nexus 7的检测为TVDPI,而Kindle Fire的HD是华电国际。 如何根据型号1280 * 800进行相同的渲染?

谢谢

+0

有趣的是,你能否给我们提供显示差异的SS(我知道这可能很难,因为你正在开发项目)? – Warpzit

+0

Nexus7是否将您的应用显示为您的默认布局应该? [Ed Burnette](https://plus.google.com/106300001086744879268/posts/Wa9xtQjZHJx)讨论了有关TVDPI解决方案的问题,特别是Nexus7。我猜Nexus正在获得默认布局。 – Korcholis

+0

为了帮助您,我们需要知道“看起来有什么不同”。 –

回答

25

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

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

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

实际存在的核心问题,因为一个设备是谷歌播放设备(的Nexus),另一种是不(点燃)。所有拥有Google Play(以及其他Google应用)的Android设备都只能通过传递一种称为兼容性测试套件(CTS)的测试套件(CTS)来验证这些设置是否符合他们提出的标准。标准本身记录在每个版本的兼容性定义文档(CDD)中。 Here is a link to the CDD for Android 4.0(7.1节涉及屏幕尺寸和密度)。 CDD告诉设备制造商他们应该报告数字上最靠近屏幕实际DPI的比例因子,在这种情况下实际上是TVDPI。

亚马逊设备不使用任何Google应用程序,包括Google Play。尽管遵循相同的标准可能符合他们的最佳利益,但他们不受其约束,而且往往不被遵守。当Nexus 7上出现TVDPI时,TVDPI会吸引所有人,但如果在设计过程中引用了CDD,亚马逊会了解它。

这如何使他们不同的表现?

的差别是不是在你的布局选择。显然,从你的屏幕截图中,两台设备都按照你的预期选择适当的布局。在布局目录中更改sw值只会影响哪些设备将选择该布局......它不会改变任何事情将如何缩放。不要试图将布局本身放置在密度特定的目录中......布局应该是灵活的。

相反,问题在于与密度无关的像素单元(即浸或DP),例如文本大小,则可能已创建的任何固定视图的大小,且可拉伸的尺寸做出的任何尺寸或大小计算。

因为这两个设备有选择以不同的比例调整资产,您使用的任何可绘制资源或您在“dp”中定义的任何值都会导致一个小的更改。让我举两个例子:

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

对于可绘制图像也是如此。如果您只定义了drawable-mdpi中的48x48图像和012x中72x72中的相同图像,则Kindle会直接使用72像素图像,并且Nexus会创建64像素的图像,因此两个素材的像素差异为8像素。

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

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

但是,一般情况下,如果您的用户界面的某些部分需要为此目的而专门进行更改,则解决方案将为您认为需要的情况定义特定的资源和维度(同样,建议在你的应用中扩展一切,以满足这种情况)。

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

对于绘制项目,添加一个drawable-tvdpi目录和扩展这些资产,以配合你是怎么想的,他们应该吸取的设备一样的Nexus 7再次与我们前面的例子,相同的图像文件从drawable-hdpi文件夹复制到文件夹drawable-tvdpi所以这两个设备将在72px下绘制相同的图像。

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

+3

这是一个很好的答案,我会补充说的是,基于密度的别名只是一个临时性的修复。当平板电脑出现符合CDD并且真正是HDPI的时候,上述所有内容都会中断。这与我们在Galaxy Tab 7中所遇到的情况是一样的,“当它是真正的MDPI时,它被报告为HDPI。每个人都试图使它工作,但当Nexus 7”出来时,所有黑客都暴露了,大多数公司不得不放弃支持Tab 7“以支持更高分辨率设备的新产品系列,目前我倾向于使用-sw533dp的新布局,但我仍然不高兴。 – JustinMorris

1

由于Nexus7是它使用的布局sw600dp资产tvdpi设备(基于在213dpi计算),该FireHD是华电国际器件和使用布局sw533dp资产结束(计算依据240dpi)

+3

为什么?密度是按像素/英寸计算的,两个设备具有相同的分辨率,两个设备的显示尺寸相同。密度差? – stoefln

1

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