基本概念
- 屏幕尺寸
屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米 - 屏幕分辨率
屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点。一般以纵向像素*横向像素,如1960*1080。 - 屏幕像素密度
屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写。屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。 - dp、dip、dpi、sp、px、pt
dp和dip是一样的,都是Density Independent Pixels的缩写,即密度无关像素。在Android中,规定以160dpi为基准,1dip=1px,如果密度是320dpi,则1dip=2px。类似sp和pt是一样的,
Android读取资源文件
Android SDK会自动屏幕尺寸选择对应的资源文件进行渲染,一般资源文件存在**/res/ 目录中,如果各个资源都有,系统会自动识别手机的屏幕密度,并调取相对应的资源文件夹里的资源文件。比如手机是HDPI的,而HDPI资源文件里有,就调取HDPI的资源。如果相对应资源文件没有,会调取接近的大资源并按比例缩小来适配(缩小损失微小,只是边缘会产生模糊像素,用户没有设计师的像素眼,影响并不大)。如果大资源也没有,会调取接近的小资源并按比例放大来适配。(放大损失大,模糊,和图片放大一个道理)。
系统加载图片前先将图片进行缩放,因此你通过getwidth得到的尺寸已经是经过缩放的尺寸了。
理论上来说只需要提供一种规格的图片资源就ok了,如果只提供ldpi规格的图片,对于大分辨率的手机如果把图片放大就会不清晰,所以需要提供一套你需要支持的最大dpi的图片,这样即使用户的手机分辨率很小,这样图片缩小依然很清晰。目前市面上最普遍的高端机的分辨率还多集中在720X1080范围,也就是多集中在xhdpi,所以目前来看xhpdi规格的图片成为了首选。
代码规范
- 使用wrap_content、math_parent、weight
layout_weight:所占宽度=原来宽度+剩余空间所占百分比的宽度 - 使用线性布局,相对布局,禁用绝对布局
- 使用限定符,如尺寸限定符,最小宽度限定符,屏幕方向限定符
res/layout-large/main.xml、res/layout-sw600dp/main.xml、res/values-sw600dp-land/layouts.xml - 使用.9图
当我们需要使图片在拉伸后还能保持一定的显示效果,比如,不能使图片中的重要像素拉伸,不能使内容区域受到拉伸的影响,我们就可以使用.9.png图来实现。
注: 如果切图放错文件夹会有什么问题?
Android会自动为其他规格的dpi屏幕适配,比如你在xhdpi放了一张120X120px大小的图片,那么在在hdpi屏幕上显示的就只有120/2*1.5=90px大小,但是如果你不小心同样把这张图片也放入了mdpi了,这个时候用wrap_content显示就会有问题。
比如假设你只在drawable_xhdpi文件夹下放了test图片,xhdpi的设备会去xhdpi文件夹下找到test图片并直接显示,而mdpi的设备优先会去mdpi文件夹里查找test图片,但是没找到,最后在xhdpi文件夹下找到,然后会自动根据density计算并缩放显示出来,实际显示出来的大小是120/2=60px, 所以整体的显示比例才会看起来比较正常。但是如果你在mdpi文件夹里也放入了同样的图片,那么mdpi的设备会直接去mdpi文件夹里寻找到test图片,并直接显示,而这时候显示不会缩放,实际显示大小就是120X120,在mdpi的屏幕上看起来就会比较大