Android 不同的屏幕 size/dpi 工作更少

Android different screen size/dpi with less work

好吧, 不幸的是,当我的应用程序已经完成并且功能齐全时,我遇到了不同的屏幕尺寸。

我找到了关于不同 devices/resolutions/dpi 实现的数千个答案,并且我尝试从每个答案中学习一些东西。

我的目标是不使用不同密度的文件夹,而是 resize/repositioning 每个布局 resolution/dpi 已经存在的图片。调整大小导致的图片模糊目前对我来说并不重要。我的应用程序是一个学校项目,我需要在几天内启动它。

我的想法是创建一组巨大的布局文件夹,例如:

layout-normal-mdpi    
layout-normal-hdpi
layout-normal-xhdpi
layout-normal-xxhdpi
layout-normal-xxxhdpi
layout-large-mdpi
layout-large-hdpi
layout-large-xhdpi
layout-large-xxhdpi
layout-large-xxxhdpi
layout-xlarge-mdpi
layout-xlarge-hdpi
layout-xlarge-xhdpi
layout-xlarge-xxhdpi
layout-xlarge-xxxhdpi

Copy/Paste 我在那里的活动,并为每个 activity 对象设置所需的 DP 值,以使应用程序在大多数设备上 usable/viewable。

之后我将创建尽可能多的虚拟设备来正确测试和编辑图形。

好吧,我又失去了什么(质量 DPI 分辨率除外)?

关于让我的应用与大多数设备兼容,您有更好的主意吗?

我的应用主要针对平板电脑,我希望它也能兼容 4 英寸以上的手机。

最后一题:

像我一样使用密度值:

layout-normal -hdpi

是个好习惯吗?它会在未来的 android 版本中实现吗?或者最好避免使用像这样的 DPI 值:

布局正常

非常感谢您的帮助。

这是我创建为 Galaxy S7 Edge 的虚拟设备的屏幕截图。它自己加载 layout-normal-xxxhdpi 布局。

Well again, what i'm losing by this way (except for quality DPI resolution)?

布局可以完全不同。某些视图可能会超出屏幕。某些文本可能未包含在其布局中。当然,ImageViews 会被拉伸成地狱。

Have you a better idea to make my app compatible with most devices?

是的。您可以根据 layout_weight.

属性构建布局

https://developer.android.com/guide/topics/ui/layout/linear.html

这适用于 LinearLayout,但也适用于 RelativeLayout,方式略有不同。 此属性的目标是为布局内的每个视图分配总大小的一定百分比。

使用示例。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="5">

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="1" />

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="2" />

    <ImageView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="3" />

    </LinearLayout>

通过这种方式,您可以构建 UI 以适应每个屏幕尺寸和密度。

但是要小心,使用这个属性会有警告。如果您使用具有 layout_weight 属性的嵌套布局,渲染视图的性能将显着降低。

Why are nested weights bad for performance? Alternatives?

假设您关心的是图像的质量,因为您根据可用的 space 调整了它们的大小,我将执行以下操作:

  1. 我会把这些图片放在 res/drawable-nodpi 例如image1_360.png、image1_540.png、image1_720.png、image1_1080.png 如果您的图片适合设备宽度。
  2. 在 res/values 中,我将创建一个 drawables.xml 文件:

    <drawable name="image1">@drawable/image1_360</drawable>
    

在 values-hdpi 中,我会用

替换该图像
    <drawable name="image1">@drawable/image1_540</drawable>

xhdpi 和 xxhdpi 也类似

  1. 在 values-w600dp 中,我会用

    替换该图像
    <drawable name="image1">@drawable/image1_540</drawable>
    

对于更高密度的桶也是如此

  1. 在 values-w720dp 中,我会用

    替换该图像
    <drawable name="image1">@drawable/image1_720</drawable>
    

对于 values-w720dp-hdpi

    <drawable name="image1">@drawable/image1_1080</drawable>
  1. 在 values-w1000dp 中,我会用

    替换该图像
    <drawable name="image1">@drawable/image1_1080</drawable>
    

这可能会因您的实际需要而异,但我们的想法是针对不同的屏幕尺寸和密度桶组合使用值文件夹,并使用 drawable XML 标签引用 drawable。

我建议你不要创建所有这些布局,而是创建不同的 dimens.xml 文件,这样你只需要创建一个布局,每个视图有一个尺寸属性,Android 根据设备屏幕尺寸自动获取。 这是一个例子:

布局:

<ImageView
        android:id="@+id/image_cat"
        android:layout_width="@dimen/width_category_image_carousel"
        android:layout_height="0dp"
        android:layout_weight="2"
        android:foregroundGravity="center_horizontal|bottom" />

FILE DIMENS.XML for sw300dp(这表示无论方向如何,最小宽度必须为 300dp)

<resources >
    <dimen name="width_category_image_carousel">220dp</dimen>
</resources>

您必须根据要支持的不同尺寸的屏幕,在资源目录的值目录中创建更多文件 dimens.xml。 您可以在此处找到有关如何定义不同维度的更多信息: https://developer.android.com/guide/practices/screens_support.html#NewQualifiers