如何支持多屏幕配置
Android系统本身自动可以支持屏幕自适应,但有时也需要应用提供屏幕配置相关的资源以达到更好的用户体验:
Android系统运行时根据当前屏幕配置选择合适的Layout和资源,如果对于的屏幕配置没有提供备选资源,则选用缺省资源进行缩放。
下表列出了Android屏幕配置可能的组合:
来看看apidemos中定义的资源目录:
比如对于drawable 来说, drawable 不带任何后缀,为缺省drawable 资源, drawable-hdpi 为高密度屏幕使用的drawable资源, drawable-ldpi 为低密度屏幕使用的drawable 资源等。
同样values 定义了多种不同配置下使用的资源。
对应不同屏幕密度下的Bitmap资源定义(.png. .jpg, .gif ,.9.png)一个原则上使用 3:4:6:8的比例来为四种不同屏幕密度提供图像资源,比如对于一个“中等密度”下像素大小为48X48的资源,
关于Density的一些额外的考虑
本节内容对于大部分应用不重要,除非你的应用在不同屏幕配置时显示上出了问题。
为了更好的理解在应用绘制图形时如何支持不同的屏幕密度配置,你应该知道下面由Android系统提供的一些支持:
Pre-scaling of resources (如bitmap drawable 资源)
Android系统根据当前设备屏幕配置不进行缩放选取设备配置相关的资源(比如对于高密度屏幕选取drawable-hdpi目录下的Drawable资源)。如果没有找到当前屏幕配置对应的资源,Android使用缺省资源(在drawable 目录下的资源)放大或是缩小以适应屏幕。Android应用认为缺省资源(比如drawable 等不带后缀的目录下)是对应于基准屏幕配置(mdpi)的资源。pre-scaling 意思就是Android系统为当前屏幕密度自动缩放Bitmap来适应屏幕的过程。
此时,如果你需要知道这些pre-scaled资源的大小,Android系统返回的是缩放之后的大小,比如对应于mdpi 下50X50像素大小的图像在hdpi屏幕下会放大到75X75像素大小,此时查询图像大小返回值为75X75. 如果你不想让Android对一些资源进行pre-scaling,可以将这些资源放在带nodpi后缀的目录下:比如 /res/drawable-nodpi。
Density 例子中的 no-dpi resource drawable 显示如下:
像素大小和坐标的自动缩放
一个应用也可以通过在Manifest文件中将android:anyDensity设为”false”或在代码中将bitmap的isScaled设为false关闭pre-scaling 。在这个情况下,Android系统会自动缩放以pixel为单位的的像素值和坐标。结果使得在不同屏幕大小的设备上仍可以显示和基准屏幕下类似的物理尺寸大小。这时如果需要返回Bitmap的大小,系统返回的是缩放后的像素值,而非实际物理像素值。
大部分情况“不应该关闭pre-scaling”,而是通过提供屏幕配置相关资源来支持多种屏幕配置。
运行时缩放Bitmap
如果应用在内存中动态创建一个Bitmap对应,Android系统会认为这个Bitmap对应于基准屏幕配置(中等密度)。缺省情况下,如果在屏幕上显示这个Bitmap,Android系统会自动缩放以适应当前屏幕。 可以使用setDensity为Bitmap 设置显示密度。
如果使用BitmapFactory来创建Bitmap对象,可以使用BitmapFactory.Options来定义Bitmap的属性,如果将inScaled设为false,则会关闭pre-sacling.
下图为Density例子 显示 pre-scale 和auto-scale 显示 low (120), medium (160), high (240) 的图像中高密度屏上显示的效果:
注意这个例子的Title : Density:High ,可能你的设备运行时结果不一样:
1
|
this
.setTitle(R.string.density_title);
|
标题的资源为R.string.density_title ,它在values ,values-large ,values-small中用不同的定义, 在应用运行时,Android系统会根据当前屏幕配置选取合适的资源,你可以多创建几种不同大小的模拟器,看看结果会有所不同,由此也可以理解本例和Android选取资源的机制。
下表给出模拟器支持的不同屏幕大小和密度的组合: