【发布时间】:2014-06-03 03:45:22
【问题描述】:
我的应用中有这个可绘制文件夹:
可绘制
drawable-hdpi、mdpi、ldpi、xhdpi 和 xxhdpi。
可绘制-sw240dp-land-xxxhdpi
可绘制-sw360dp-land-xxhdpi
可绘制-sw6000dp-land-xhdpi
我在所有这些文件夹中都有相同大小的可绘制文件。我需要那些文件夹导致横向密度。
有什么方法可以避免在不同的可绘制文件夹中处理相同的文件?
提前致谢
【问题讨论】:
我的应用中有这个可绘制文件夹:
可绘制
drawable-hdpi、mdpi、ldpi、xhdpi 和 xxhdpi。
可绘制-sw240dp-land-xxxhdpi
可绘制-sw360dp-land-xxhdpi
可绘制-sw6000dp-land-xhdpi
我在所有这些文件夹中都有相同大小的可绘制文件。我需要那些文件夹导致横向密度。
有什么方法可以避免在不同的可绘制文件夹中处理相同的文件?
提前致谢
【问题讨论】:
有什么方法可以避免在不同的可绘制文件夹中处理相同的文件?
首先去掉那些你不需要的:
res/drawable/ 是不必要的,因为它永远不会被使用,因为您在各种密度桶中都有可绘制对象。对于您未使用的密度(例如,-tvdpi/),Android 将始终缩放您的 res/drawable-*dpi/ 资源之一以匹配屏幕密度。
如果res/drawable-sw360dp-land-xxhdpi/ 与res/drawable-xxhdpi/ 中的图标文件相同,则不需要res/drawable-sw360dp-land-xxhdpi/。
如果res/drawable-sw6000dp-land-xhdpi/ 与res/drawable-xhdpi/ 中的图标文件相同,则不需要`res/drawable-sw6000dp-land-xhdpi/。
等等
除此之外,您还可以使用bitmap resource aliases 允许一个位图文件在多个资源目录中表示。
【讨论】:
是的,有,但代价是一些轻微的扭曲和仔细的布局设计。你能做的就是把你的高分辨率drawable放到drawable-nodpi中; Android 将从该文件夹中提取可绘制对象而不进行缩放。接下来,为各种屏幕尺寸创建一系列维度文件,dimens.xml。例如,对于正常尺寸的屏幕:
<resources>
<dimen name="dim_0dp">0dp</dimen>
<dimen name="dim_1dp">1dp</dimen>
<dimen name="dim_2dp">2dp</dimen>
<dimen name="dim_3dp">3dp</dimen>
<dimen name="dim_4dp">4dp</dimen>
<dimen name="dim_5dp">5dp</dimen>
<dimen name="dim_6dp">6dp</dimen>
<dimen name="dim_7dp">7dp</dimen>
<dimen name="dim_8dp">8dp</dimen>
<dimen name="dim_9dp">9dp</dimen>
...
</resources>
而且,sw-600dp 平板电脑的资源文件将如下所示:
<resources>
<dimen name="dim_0dp">0dp</dimen>
<dimen name="dim_1dp">1.5dp</dimen>
<dimen name="dim_2dp">3dp</dimen>
<dimen name="dim_3dp">4.5dp</dimen>
<dimen name="dim_4dp">6dp</dimen>
...
</resources>
然后,在您使用 ImageView 或使用可绘制对象设置背景的布局中的每个位置,请确保根据您的尺寸文件指定宽度和高度。例如:
<ImageView
android:layout_width="@dimens/dim_10dp"
android:layout_height="@dimen/dim_20dp" />
因此,在手机上,图像将缩放为 10dp 和 20dp;而在 600dp 平板电脑上,它将缩放到 15dp 和 30dp。这意味着一些轻微的失真,但由于您是按比例缩小而不是按比例放大,因此大多数用户很难检测到失真。
这是我们用于发布三款成功游戏的策略,否则我们的 APK 会非常庞大。
【讨论】: