我正在实现一个适用于Android的应用程序(API 10(。我对平板电脑(据说(和手机的设计很少。关于上一句话,这听起来可能有点愚蠢:在我看来,布局应该根据设备的物理尺寸而不是分辨率来选择,否则可能会有一部高分辨率的手机以相当混乱、不适当的小尺寸呈现 5x5 的网格。为了按物理大小进行划分,我必须使用/res/layout-* 文件夹。同意?
另外:我对多屏指南对物理尺寸的定义有点困惑。你介意解释一下物理尺寸在Android方面是什么意思,它是用什么来衡量的吗?与 dpi 有什么相关性吗?
谢谢。
API 级别 10 的解决方法可能是这样的:
-
使用 SDK 中的兼容库,以便可以使用片段进行设计。
-
假设安卓 3 之前的所有东西都是手机。例如,为此在 layout/* 中使用布局文件(其余文件将基于它,除非被覆盖(。这个假设基本上只对2009年的原始三星Galaxy Tab 7"是错误的。
-
假设 android 3.x 上的所有内容都是平板电脑(它们是(,因此如果需要,请执行一些特定于平板电脑的布局,并将它们放在 layout-v11 下(如果有任何特定于 android 3.1 的内容,也可能是布局 v12(。平板电脑特定的布局可能意味着您以不同的方式排列片段和/或同时显示多个片段。
-
所有较新的(android 3.2+(您可以使用 api 级别 13 中的新内容。例如布局SW600dp/用于某些布局等 http://developer.android.com/guide/practices/screens_support.html#DeclaringTabletLayouts
物理尺寸通常以英寸为单位,它只是告诉您真实设备的屏幕尺寸(手机通常为 3-4 英寸,平板电脑通常为 8-11 英寸(。
dpi,与它无关。Dpi表示屏幕密度,即在给定区域(通常为平方英寸(中显示的像素数。它可以被视为屏幕质量的衡量标准。
分辨率由两者的乘积给出;它表示屏幕上物理像素的总数。
回到你的第一个问题,你应该尽可能地与密度无关;你的应用程序应该在不同密度的设备上"看起来一样"。/res/layout-* 文件夹旨在提供此功能,系统会将可绘制资源缩放到适当的大小,然后你可以在清单中声明你的应用支持任何密度:
android:anyDensity="true"
在第 http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch 页上,您可以了解 Android 如何选择最匹配的资源。
使用 Android API 10,定位平板电脑的最佳选择可能只是使用以下方法区分代码中屏幕的实际大小:https://stackoverflow.com/a/5789916/1319155然后,如果返回的大小值大于 6(或要声明为"平板电脑"的任何大小(,则只需加载不同的可绘制对象。
您不能真正只使用大小文件夹(即布局/大(的原因是这些文件夹不能很好地区分手机和平板电脑。Kindle Fire和Galaxy Nexus都可以被认为是"大型"设备。
你不能真正使用dpi的原因是,这并不能很好地反映它是什么类型的设备,只是屏幕上像素的"密集"程度。无论如何,大多数新手机都比平板电脑密度大得多(每英寸像素更多(。
有两种方法可以做到这一点。 从 Android 1.6 (API 4( 开始,有四种布局来描述显示器的物理尺寸:小、普通、大和超大。 如 http://developer.android.com/guide/practices/screens_support.html 所述,这些对应于:
- 超大屏幕至少为 960dp x 720dp
- 大屏幕至少为 640DP x 480DP
- 普通屏幕至少为 470dp x 320dp
- 小屏幕至少为 426DP x 320DP
请注意,这些是以 DP 而不是 DPI 测量的。 DPI 是每英寸点数,指定屏幕密度。 DP,也写成DIP,是与密度无关的像素。 再次来自指南:
与密度无关的像素 (dp(
定义 UI 布局时应使用的虚拟像素单位,用于以与密度无关的方式表示布局尺寸或位置。 与密度无关的像素相当于 160 dpi 屏幕上的一个物理像素,这是系统为"中等"密度屏幕假定的基线密度。在运行时,系统会根据需要根据正在使用的屏幕的实际密度透明地处理 dp 单元的任何缩放。dp单位到屏幕像素的转换很简单:px = dp * (dpi/160(。例如,在 240 dpi 的屏幕上,1 dp 等于 1.5 物理像素。在定义应用程序的 UI 时,应始终使用 dp 单位,以确保在不同密度的屏幕上正确显示 UI。
换句话说,160 DP = 1"。 应用此标准,我们看到:
- 超大屏幕至少为 6" x 4.5"(7.5" 对角线(
- 大屏幕至少为 4" x 3"(5" 对角线(
- 普通屏幕至少为 2.9" x 2"(3.5" 对角线(
- 小屏幕至少为 2.6" x 2"(3.3" 对角线(
(不知道为什么选择如此奇怪,但这就是他们的定义。
从 Android 3.2 开始 (API 13(,还有更多选项,如下所述:http://developer.android.com/guide/practices/screens_support.html#DeclaringTabletLayouts
在这里,您可以使用"最小屏幕宽度","可用宽度"或"可用高度"选项来定义自己的类别;同样,有问题的单位是DP,即1/160"。 请注意,这些指定设备上两个尺寸中较小的一个 - 例如,对于 7 英寸平板电脑,他们建议指定 layout-sw600dp,即"最小宽度 3.75 英寸",这将介于 API 4 中定义的"大"和"超大"尺寸之间。 他们对这个主题有许多具体的评论,包括关于如何测量宽度的注释(它可能不包括通知栏之类的东西(,所以值得看看文档。