Android develop 多分辨率适配
本文内容来自http://developer.android.com/guide/practices/screens_support.html
Android程序可以运行在不同屏幕尺寸、不同像素密度的设备上,系统会自动做一些缩放,并提供api来让用户自己对特殊的尺寸、特殊的像素密度的设备上的UI单独适配。
下面说一些适配技巧。
- 概述
1.术语和概念
屏幕尺寸:设备的物理尺寸,屏幕的对角线长度。Android简单的将屏幕尺寸分为4种:small, normal, large, and extra-large。
屏幕密度:屏幕的像素密度,通常指的是一英寸物理长度上的点的数量 (dpi :dots per inch)。例如:屏幕尺寸一样的设备中,low密度的像素点数量就比high密度的少。Android简单的将屏幕密度分为6种:low, medium, high, extra-high, extra-extra-high, and extra-extra-extra-high
方向:设备是横向的或是纵向的,不同设备默认方向可能不同,而且设备旋转时,方向也会变化。
分辨率:屏幕物理像素点的总数。多分辨率适配时,需要关注屏幕尺寸和屏幕密度,而不是分辨率。
设备独立像素(dp:Density-independent pixel):这是一种虚拟的像素单位,在做UI布局时,推荐使用它(dp)来作为单位。
1dp等价于160dpi(一英寸上有160个点)屏幕上的1像素,medium屏幕密度的标准密度值为160dpi。系统会在运行时自动将dp转换为px(物理像素)来显示。转换公式为:px = dp * (dpi / 160)。比如:在240dpi的屏幕中,1dp等于1.5px
2.支持屏幕范围
从Android1.6 (API Level 4)开始,Android开始支持多尺寸、多密度的设备了。
屏幕尺寸分为4种:small, normal, large, and xlarge。
注:Android 3.2 (API level 13)以上的平板适配略有不同
屏幕密度分为6种:
- ldpi (low) ~120dpi
- mdpi (medium) ~160dpi
- hdpi (high) ~240dpi
- xhdpi (extra-high) ~320dpi
- xxhdpi (extra-extra-high) ~480dpi
- xxxhdpi (extra-extra-extra-high) ~640dpi
屏幕尺寸和密度的分类都是一个范围,比如同样都属于large尺寸的两个设备屏幕大小也会不同(一个5寸,一个6寸),范围的划分见下图(分界并不严格,比如4.4寸的设备,可以划分为normal,也可归为large)

开发时,应该以dp为单位,避免系统在自动缩放时引起显示错误,下面列出不同屏幕尺寸对应的dp大致范围:
- xlarge screens are at least 960dp x 720dp
- large screens are at least 640dp x 480dp
- normal screens are at least 470dp x 320dp
- small screens are at least 426dp x 320dp
为了更好的适配多分辨率,可以为不同的尺寸、密度准备多套资源(图片、布局文件等)
3.密度独立
布局需要做到密度独立,否则在不同密度的设备上显示效果会有很大差异

注:未做到密度独立的布局在low, medium, and high-density 屏幕上的显示效果

注:做到密度独立的布局在low, medium, and high-density 屏幕上的显示效果
Android系统在2方面帮助开发者做到布局时密度独立:
1.根据屏幕密度,自动缩放dp单位
2.根据屏幕密度,选择合适的资源显示
- 怎样做适配
做适配工作的基础就是管理布局、图片的缩放,Android系统已经替我们做了很多工作,为了更好的适配,我们还需要做:
1.在manifest中明确定义app支持的屏幕尺寸
在manifest中使用<supports-screens>标签定义app所支持的屏幕尺寸,尺寸不在配置中的设备将不能安装你的app。如果不设置,将会默认支持所有尺寸。
2.为不同尺寸的屏幕准备不同的布局文件
Android会自动的缩放布局来适应屏幕,这样做在大多数时都还好,但有时,为了布局更加自然协调,在大尺寸的屏幕的页面上可以显示更多的元素(相对于小尺寸的屏幕),为了达到这样的效果,你可以在定义资源文件夹的时候加上适当的修饰语(small, normal, large, and xlarge),比如专为extra-large屏幕设计的布局文件可以放到layout-xlarge/下面。
在Android 3.2 (API level 13)以后,更推荐使用sw<N>dp修饰语(small等不再推荐了),比如专门为宽度在600dp以上的屏幕设计的布局可以放到layout-sw600dp/下面
3.为不同密度的屏幕准备不同的图片资源
通常Android系统在绘制图片时,会自动缩放位图 (.png, .jpg, and .gif files) 及Nine-Patch图片(.9.png files),自动缩放有时会出现失真现象。为了避免个问题,我们需要为不同屏幕密度ldpi (low), mdpi (medium), hdpi (high), xhdpi extra-high), xxhdpi (extra-extra-high), and xxxhdpi(extra-extra-extra-high)准备不同的资源。例如,为high-density屏幕准备的资源放到drawable-hdpi/下面。
有的设备会将launcher icon放大25%,如果你的launcher icon已经是extra-extra-high-density了,那么这会使你的launcher icon看起来不那么清晰。解决这个问题,需要准备一个更高密度的launcher icon资源放到mipmap-xxxhdpi下面。
注:launcher icons推荐放到res/mipmap-[density]/下面,而不是res/drawable-[density]/。这样可以避免其他的一些因素影响到应用图标选择。
Android在选择资源时,会先选符合条件的,若是没有,就选临近的。比如一个480dpi的设备在选图片时,会先到drawable-xxhdpi文件夹下寻找资源,若找不到,会到drawable-xhdpi文件夹下寻找,依次类推。若是按屏幕尺寸分类时,寻找资源只会找当前屏幕尺寸及比其小的分类。比如app中所有的资源都放在layout-xlarge/下面,在normal-size的设备上运行app就会因为找不到资源而引起崩溃。

浙公网安备 33010602011771号