屏幕尺寸、屏幕分辨率、屏幕密度
屏幕尺寸:是手机对角线的物理尺寸,以英寸(inch)为单位。比如某某手机为“5寸大屏手机”,就是指对角线的尺寸为5英寸,5寸×2.54厘米/寸=12.7厘米。
屏幕分辨率:屏幕分辨率就是手机屏幕的像素点数,指屏幕横竖各有多少个像素,一般描述成屏幕的“高×宽”。安卓手机屏幕常见的分辨率有 800×480、1280×720、1920×1080等,例如1280×720表示此屏幕在纵向有1280个像素,在横向有720个像素。
屏幕密度:屏幕密度就是每英寸的像素点数(dpi),数值越高当然显示越细腻。对于屏幕来说,dpi越大,屏幕的精细度越高,屏幕看起来就越清楚。手机可以有相同的分辨率,但屏幕尺寸可以不相同。
屏幕密度计算示例:LG Nexus 5为4.95英寸、1920×1080的主屏,它的dpi为:
sqrt(1920*1920+1080*1080)/4.95=445dpi
Android 常见分辨率
可通过查看最新的友盟指数获取。
2015年9月,占比5%以上的分辨率如下:
720P:1280×720(标清,standard definition,SD)
1080P:1920×1080(高清,high definition,HD)
WVGA:800×480
FWVGA:854×480
QHD:960×540
dip、dp、px、sp 介绍
px:pixel,像素,构成图像的最小单位。
dp、dip:Density Independent Pixels,密度无关像素,以160dpi为基准,1dip=1px。
sp:Scale-Independent Pixels,可以根据文字大小首选项进行放缩,主要用于字体显示。
谷歌开发指导中推荐使用12sp以上的字体,否则用户将无法看清。另外,从小到大,推荐使用12sp、14sp、18sp、22sp作为字体首选大小。设置字体大小时不要使用奇数或小数,可能会造成精度丢失。
在layout文件中设置控件尺寸时应采用fill_parent、match_parent、wrap_content和dp。具体来说,设置view的属性android:layout_width和android:layout_height的值时,fill_parent、 match_parent、wrap_content和dp比px更好,文字大小应该使用sp来定义。
在程序的代码中不要出现具体的像素值,在dimens.xml中定义。为了适应多种屏幕,android建议开发者不要使用具体的像素来表示控件尺寸。
mdpi、hdpi、xdpi、xxdpi
不同像素密度下,同一张图片的显示效果不同。为了更好的显示效果,我们需要给不同的像素密度配备不同的图片。
如何实现呢?开发工具会自动创建不同像素密度的drawable文件夹。
- drawable-ldpi
- drawable-mdpi
- drawable-hdpi
- drawable-xhdpi
- drawable-xxhdpi
我们需要将不同的图片放到不同像素密度的文件夹中,程序运行时,系统会自动去寻找最适合的图片。
这些像素密度的修饰符mdpi、hdpi、xhdpi等还可以用来修饰values、layout等文件夹,与drawable的用法一样。
谷歌对不同的像素密度进行了分类,常见的有以下五种:
- mdpi:120dpi~160dpi
- hdpi:160dpi~240dpi
- xhdpi:240dpi~320dpi
- xxhdpi:320dpi~480dpi
- xxxhdpi:480dpi~640dpi
安卓巴士中有如下的介绍:
在设计图标时,对于五种主流的像素密度应按照2:3:4:6:8的比例进行缩放。例如,一个启动图标的尺寸为48×48dp,这表示在mdpi上其世纪尺寸应为48×48px,在hdpi的屏幕上其世纪大小是mdpi的1.5倍(72×72px),在xdpi的屏幕上其实际大小是mdpi的2倍(96×96px),依次类推。
另外,虽然Andriod也支持低像素密度(ldpi)的屏幕,但无需为此费神,系统会自动将hdpi尺寸的图标缩小到1/2进行匹配。
AndroidManifest.xml 设置
android:anyDensity=”true”时,应用程序安装在不同密度的终端上时,程序会分别加载xxhdpi、xhdpi、hdpi、mdpi、ldpi文件夹中的资源。
android:anyDensity=”false”时,即使在文件夹下拥有相同资源,应用不会自动地去相应文件夹下寻找资源。
layout 适配不同分辨率
将mdpi、hdpi、xdpi等应用到layout上,在res目录下创建不同的layout文件夹,比如layout-640x360、layout-800x480、layout-hdpi等,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。
9-patch图片
在android中,不仅可以使用.png、.jpg、.gif的普通图片作为图片资源,而且可以将扩展名为.9.png的9-patch图片作为图片资源。android的SDK目录tools下的draw9patch工具可以生成一个可以伸缩的标准png图像,该图像的扩展名为.9.png。 9-patch图片通常用作背景,与普通图片不同的是,使用9-patch图片作为屏幕或者按钮背景时,当屏幕尺寸或按钮大小改变时,图片可自动缩放,达到不失真效果。
9-patch PNG图片,在原生PNG图片四周空出一个像素间隔,用来标识PNG图片中哪些部分可以拉伸、哪些不可以拉伸、背景上的边框位置等。
drawable、layout 适配横竖屏
drawable
drawable-land-hdpi,当屏幕为横屏,且为高密度时,加载此文件夹的资源。
drawable-port-hdpi,当屏幕为竖屏,且为高密度时,加载此文件夹中的资源。
layout
在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,以适应对横屏竖屏自动切换。
参考资料: