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 调整了它们的大小,我将执行以下操作:
- 我会把这些图片放在 res/drawable-nodpi 例如image1_360.png、image1_540.png、image1_720.png、image1_1080.png 如果您的图片适合设备宽度。
在 res/values 中,我将创建一个 drawables.xml 文件:
<drawable name="image1">@drawable/image1_360</drawable>
在 values-hdpi 中,我会用
替换该图像
<drawable name="image1">@drawable/image1_540</drawable>
xhdpi 和 xxhdpi 也类似
在 values-w600dp 中,我会用
替换该图像
<drawable name="image1">@drawable/image1_540</drawable>
对于更高密度的桶也是如此
在 values-w720dp 中,我会用
替换该图像
<drawable name="image1">@drawable/image1_720</drawable>
对于 values-w720dp-hdpi
<drawable name="image1">@drawable/image1_1080</drawable>
在 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
好吧, 不幸的是,当我的应用程序已经完成并且功能齐全时,我遇到了不同的屏幕尺寸。
我找到了关于不同 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 调整了它们的大小,我将执行以下操作:
- 我会把这些图片放在 res/drawable-nodpi 例如image1_360.png、image1_540.png、image1_720.png、image1_1080.png 如果您的图片适合设备宽度。
在 res/values 中,我将创建一个 drawables.xml 文件:
<drawable name="image1">@drawable/image1_360</drawable>
在 values-hdpi 中,我会用
替换该图像 <drawable name="image1">@drawable/image1_540</drawable>
xhdpi 和 xxhdpi 也类似
在 values-w600dp 中,我会用
替换该图像<drawable name="image1">@drawable/image1_540</drawable>
对于更高密度的桶也是如此
在 values-w720dp 中,我会用
替换该图像<drawable name="image1">@drawable/image1_720</drawable>
对于 values-w720dp-hdpi
<drawable name="image1">@drawable/image1_1080</drawable>
在 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