【问题标题】:Best practices to use when targeting multiple screen resolutions on Android在 Android 上定位多个屏幕分辨率时使用的最佳实践
【发布时间】:2015-05-18 02:44:40
【问题描述】:

在设计 UI 时,我们需要针对许多 android 突变和各种屏幕分辨率。

以上两个问题都建议对不同的屏幕使用不同的布局代码。真的有必要吗?

推荐

为不同的屏幕尺寸提供不同的布局

为不同的屏幕密度提供不同的位图可绘制对象

但我仍然认为,我们可以支持多个屏幕,而无需为每个屏幕分辨率创建独立布局。还是我错了?

我知道并且确实使用 9-patch 来处理可缩放的背景图像(或表单输入等)
我确实使用 dp(密度像素)来声明相对于屏幕密度的尺寸

但是接下来的最佳做法是什么

【问题讨论】:

    标签: java android xml layout


    【解决方案1】:

    我认为这个问题的答案最近发生了变化,但我会回顾一下历史解决方案。

    Honeycomb 之前,解决方案是创建一个动态布局,可以根据屏幕大小进行自我调整(使用 9-patches、dips、扩展/收缩布局等)。这意味着您的所有视图都不可能是“像素完美的”,但您可以根据遇到的不同纵横比进行调整。有时您会想出不同的横向和纵向布局,但除此之外就没有必要进行自定义了。

    随着 Honeycomb 的发布,问题变得更加复杂。现在,您的屏幕尺寸明显不同,您的应用程序拉伸看起来一点也不好看。您有从 7 英寸到 10 英寸的平板电脑——哪一款是“大”与“超大”? 3.0 和 3.1 是一个尴尬的时期,您必须检测 API 版本/屏幕尺寸并相应地配置您的应用(假设您的应用同时支持手机和平板电脑)。

    但是,在 3.2 及更高版本中,一切都发生了变化。现在,最佳实践可以这样描述:像网页设计师而不是 Android 设计师一样思考。不要考虑手机、平板电脑、横向和纵向布局,而不要考虑适用于特定屏幕尺寸的布局。

    this blog postthese slides 详细介绍了这个思考过程,但我认为最好通过访问一些示例网页并查看它的实际情况来演示。尝试访问this page(或this page,或this page)并更改浏览器的大小。请注意它们如何根据宽度动态更改布局 - 这也是您在 Android 中想要的。

    所以现在您已经有了一个在屏幕宽度 150dp 和 400dp 之间工作的布局;另一种在 401dp 和 800dp 之间工作;第三个处理 800dp 和 1000dp 等。这种思维方式最终不会让您作为开发人员做比以前更多的工作 - 而不是定义手机布局、平板电脑布局(每个都有纵向/横向布局),您只需定义一些适用于不同宽度的布局。

    现在我们处于一个尴尬的过渡阶段,因为大多数人没有拥有支持这种做法的设备。所以“最佳实践”基本上就是以上所有内容。几年后,当每个人都获得了 ICS 及更高版本时,我们都可以松一口气了。

    (如果您正在寻找具体的解决方案,我深表歉意;这个答案最终是相对理论上的,而不是具体的答案,主要是因为我觉得这个问题非常开放。如果您有一个特定的问题,您想解决,我可以尝试在其他地方解决。)

    【讨论】:

    • 没有道歉的理由,看了你的回答就完全正确和清楚了,情况很复杂。提出这个理论可能比写出所有可能的组合更好。谢谢
    【解决方案2】:

    如果您使用“dp”构建视图,基本上,它与 eack 屏幕尺寸的尺寸相同。
    在大多数情况下,您会希望您的视图会根据屏幕大小调整自身大小。
    当然,在大多数情况下,您需要为平板电脑构建单独的布局。
    但是,除此之外,我还建议您执行以下步骤:

    1. 将this 库添加到您的项目中。

    2. 现在在您的布局中,您可以编写这样的视图:

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="I'm scalable!" 
        android:textSize="@dimen/_12sdp"/>
    

    在本例中,您的 TextView 将在每个屏幕尺寸上进行缩放。

    【讨论】:

    • 顺便说一句,如果您在每个文件中添加以下具有适当值的内容,您可以使用它来了解预览是使用什么dimen文件values-sw### #dp
    【解决方案3】:

    以下是一些建议,按随机顺序排列:

    • Avoid AbsoluteLayout,我知道它已被弃用,但你仍然可以使用它;算了,改用 LinearLayout 和 RelativeLayout
    • 使用 9-patch 创建按钮和背景,以便它们在每种分辨率下看起来都一样
    • 使用 DisplayMetrics() 获取有关屏幕的信息,在不同的屏幕上显示不同的内容(即在智能手机中显示 AdMob“横幅”,在平板电脑中显示 AdMob“排行榜”)
    • 首先创建 WVGA 布局(这只是个人意见,但我发现它是一种不错的工作方式):据我所知,大多数智能手机是 WVGA 或至少是 HVGA(QVGA 不是如此频繁),因此创建一个完美的 WVGA 布局将使您能够满足许多手机,而不是您可以为 lpdi 屏幕和平板电脑(目前也占市场份额的少数)创建不同的布局

    最后,我建议您为手机和平板电脑创建一个布局,它可以根据屏幕分辨率自行调整:这将适合大多数设备;对于边缘设备(即 7 英寸平板电脑或 5.3 英寸手机),我会使用不同的可绘制对象/不同的 XML 布局。

    【讨论】:

    • 所以我仍然无法避免为不同的屏幕创建不同的布局 xml?仅表示在考虑小屏幕时,平板电脑不是解决方案的一部分,我清楚地了解我们需要为移动设备和平板电脑创建其他布局
    • 如果你想创建一个高质量的应用程序,你可能必须创建不同的布局和不同的drawable。但这完全取决于您要创建什么:如果您正在谈论创建游戏,某些游戏引擎(即 AndEngine)可以自动缩放以适应屏幕。
    【解决方案4】:

    我建议尽可能使用相对计算而不是绝对计算。避免对填充、边距等数字进行硬编码。只需给它们一个与所需属性相关的值,如宽度、屏幕高度或任何组件。

    【讨论】:

    • 所以你推荐在控制器中使用计算?渲染后调整视图还是如何调整?您能否提供一些链接或代码示例?谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多