【问题标题】:Density-specific layouts vs. size-specific layouts in AndroidAndroid 中特定于密度的布局与特定于尺寸的布局
【发布时间】:2013-01-25 23:42:52
【问题描述】:

很长一段时间以来,我一直在声明 4 种不同密度的资源文件夹:

  • drawable-ldpi
  • drawable-mdpi
  • drawable-hdpi
  • drawable-xhdpi

在布局的 XML 中,我一直在为这些图形使用固定宽度(但仍然与密度无关),例如 128dp

但是,随着越来越多的大屏幕手机(尤其是平板电脑)推出,这种方法不再奏效。尽管您以这种方式提供与密度无关的资源,但布局在大屏幕上看起来并不好。

这就是为什么我认为我需要添加取决于屏幕大小的 Dimension 资源,以便在 XML 布局中使用,例如:

  • 价值观
  • 值-w600dp
  • 值-w720dp
  • 值-w1024dp

但这是否意味着我应该放弃支持这 4 个密度容器?还是我需要提供 16 个资源文件夹,即密度和大小的每种组合一个?

我在Android documentation 中找不到关于这个主题的任何好的帮助。

【问题讨论】:

    标签: android android-resources


    【解决方案1】:

    drawables 和布局是不同的。要回答您的问题,您是否应该停止支持这些密度。是的,但您仍应支持 xdpi 和 hdpi。 Romain Guy 最近表示,像 Nexus 7(在 tvpi 上)这样的现代设备可以适当地扩展资产,以至于不需要 mdpi。再也没有人使用 ldpi 了。最后我看的是不到 2% 的市场。

    关于布局。 Nexus 7 (1280x800 tvdpi) 会使用 values-w1024dp 中的某些内容,但仍会从 drawable-hdpi 文件夹中获取资源。这两者并不相互排斥。像 S3 这样的东西也会从 values-w1024dp 中提取,但使用 drawable-xdpi。如果您的用例需要,您只需要提供替代布局。

    那么你需要 16 种不同的东西吗?不,您确实需要 xdpi 和 hdpi(如果不是 mdpi)。您可能想要包含不同尺寸的替代布局。您可以随心所欲地具体化或通用化。除非您正在为手机和平板电脑(7 和 10 英寸)制作混合应用程序,否则您可能不需要很多 xxxx-sizexxx 文件夹。

    在布局的 XML 中,我一直在为这些图形使用固定宽度(但仍然与密度无关),例如 128dp。

    这可能是您的问题的根源。您的布局应该使用 wrap_content 和 match_parent 尽可能流畅。固定尺寸应保留在您提前知道尺寸的侧面和图像周围的填充。如果你这样做,你的布局在从 320 x 200 到 GTV 的任何尺寸都应该看起来不错。

    【讨论】:

    • 谢谢!不幸的是,流体布局并不总是可行的。在某些情况下,您必须使用固定(但与密度无关)的尺寸。我想我必须提供 16 (4x4) 个文件夹,因为如果您在 layout-w1024dp 中使用比在 layout-720dp 中更大的图形,而两个设备都可以有 xhdpi 屏幕,layout-w1024dp 的图形肯定必须更大,不需要他们吗?
    • 好的,那就拿你想要的吧。我(和 Android 工程团队)不同意你的观点。固定大小的布局不是常态,在两者之间应该很少。听起来您正在尝试根据屏幕尺寸提供本地化。我认为你把这些问题弄得太复杂了。
    • 附注你明白 xdpi 文件夹中的图形更大吧?比率为 3、4、6、8。所以放在 hdpi 中的图像是 xdpi 像素大小的 6/8。当您编写 background="@drawable/myImage" 代码时,Android 会自动为您选择正确的 dpi 图像,从而无需为获取不同的资源而定义不同的布局。你唯一会这样做是为了本地化(或者如果你真的想要每个屏幕尺寸的不同体验)
    • 不,我不想做本地化,是的,当然,我了解密度特定的文件夹(ldpi 到 xhdpi)。但正如我所写,当两个屏幕都是xhdpi 并且一个请求布局layout-w1024dp(因为它更大)而另一个请求layout-640dp(因为它更小,但仍然是xhdpi),那么他们可以'不只是两者都使用xhdpi文件夹中的Drawables,因为由于布局不同,第一个屏幕需要更大的Drawables(但仍然是相同的密度)。
    • @MarcoW.:“不幸的是,流体布局并不总是可行的。在某些情况下,你必须使用固定(但与密度无关)的尺寸”——也许你应该打开一个新的 SO问题,您在哪里描述此类布局,以便向您展示如何使它们变得流畅,或者至少是响应式的。
    【解决方案2】:

    1) 关于布局中的尺寸(values/dimens.xml):

    值值-w600dp 值-w720dp 值-w1024dp

    但这是否意味着我应该放弃支持这 4 个密度 容器?还是我需要提供 16 个资源文件夹,即一个用于 密度和大小的各种组合?

    不,您不需要为每个 dpi 存储桶 (hdpi/xhdpi) 提供不同的尺寸,因为尺寸已经根据设备进行了放大或缩小(如果您使用的是 dp 而不是 px)。因此对于尺寸,您只需要为不同尺寸的设备提供值(因此名称为 values-smallest possible width-600-dp)。因为您不希望手机上的 16dp 填充和 10 英寸平板电脑上的 16dp。您需要 64dp。不,设备的密度无关紧要。它仍然需要具有相同的填充在各自的设备宽度上。所以对于尺寸,您只需要考虑设备的实际物理尺寸。

    2) 关于不同分辨率的drawables缩放(drawables/xdpi): 系统会为设备适当地缩放它们。你不需要担心这个。此外,您无需在此处添加任何其他存储桶。只需使用 mdpi/hdpi/xhdpi 或者 xxhdpi,因为未来许多新设备将使用新的密度。

    结论:有 2 个不同的 UI 构建组件根据 2 个不同的规则而变化:基于屏幕密度的可绘制对象和基于屏幕大小的尺寸。不要把一个误认为另一个,并认为你需要在 values 文件夹中放置数十个存储桶,因为这不仅是错误的,而且令人难以置信。

    【讨论】:

    • 谢谢!如果就这么简单,那就太好了 :) 但实际上我认为这可能会更困难。让我再解释一下我的例子:一个旧设备有xhdpi,但只说480x800像素。全新的平板电脑也有xhdpi,但屏幕分辨率为2560x1600。所以你认为它们既可以使用xhdpi 图形又可以平滑缩放?
    • 我明白你的问题。如果您想为两个设备添加一个分辨率为 480x800 的背景可绘制对象,那么它将在平板电脑上进行拉伸。但这不是一个新问题。这在过去也存在,但规模不大。所以你可以做你过去做的事情(添加最大分辨率的drawable,然后让系统缩小它);或者只是在通常的存储桶之外添加 drawables-xhdpi-sw600dp。但是你仍然不需要几十个桶;还混有dimens。它仍然很容易管理。
    • 是的,没错,drawables-xhdpi-sw600dp。如果您将其付诸实践,这就是导致数十个文件夹的原因。
    • 根本没有。用于手机的 mdpi、hdpi、xhdpi; hdpi-sw600dp, xhdpi-sw600dp 用于平板电脑;也许如果您真的需要更多控制,还可以为高分辨率 10" 平板电脑添加 xhdpi-sw720dp。总共有 6 个存储桶。它们的数十个在哪里?但是,请记住,只有当您需要非常精细的颗粒控制时可绘制对象,例如需要在整个屏幕上拉伸的自定义背景或大型可绘制对象。对于不需要拉伸的启动器图标和操作栏图标,默认的手机存储桶就足够了。你把事情复杂化了......跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 2017-12-11
    • 2011-12-22
    相关资源
    最近更新 更多