android中图片适配是一件很棘手的事情,本篇文章详细的介绍屏幕显示的原理,为什么会资源文件中会存在
drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi等文件夹,为什么要使用dp作为单位等等。
首先从这两张图片的显示效果开始说起
1、这是一张200x200的图片在不同的手机上的显示效果。很明显第二张图片看上去要比第一张占用的空间小很多?这是为什么呢?
这里我们引入 ppi (pixel per inch)名词,翻译过来就是每英寸的距离像素点的个数。现在来解释上面的现象。对于一张200x200像素的图片,
我国我们想要显示在 200ppi 的手机上,那么占用屏幕的长和宽均为 200pix / (200pix / inch) = 1 inch ,也就是说要占用 1 inch x 1 inch,
如果要显示在 300ppi 的手机上,那么占用屏幕的长和宽均为 200pix / (300pix / inch ) = 2/3 inch,也就是说对于 ppi越高的手机,
单位inch上能够显示更多的像素点,因此当这两种手机显示同样多的像素点的时候,ppi 越高的手机占用的空间就越小。这
就是我们想要图片在各种手机屏幕上都显示一致的效果时需要解决的问题。
2、既然这种效果不是我们想要的,怎么做才能获取一致的显示效果呢?下面介绍三种方法
方法一:对每一中不同的ppi使用不同的图片,这需要我们先判断屏幕的ppi,再对图片进行处理,然后显示,显然比较麻烦。
而且对于获取屏幕ppi这个参数android并没有提供给我们api调用。所以这种办法基本行不通
方法二: 在用eclipse开发环境生成一个android项目后,系统会给我们生成drawable-ldpi、drawable-mdpi、drawable-hdpi、
drawable-xhdpi,drawable-xxhdpi,对于同一张图片资源,我们分别创建这五个版本来适应不同的屏幕。假设你想一张图片
在 200ppi和400ppi的手机上显示的长和宽都是一样的为 1inch x 1inch,那么你就需要制作一张200x200的图片和一张
400x400的图片,然后放入对应得drawable目录中就可以了。那么程序运行时怎么知道自己到底是使用哪个drawable目录下
的图片呢?这个是不需要我们考虑的,而是手机厂商考虑的问题,只需要知道,程序会使用适应当前屏幕的目录下的图片
资源。
drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi,drawable-xxhdpi,这几个目录对应的pppi为
120ppi 160ppi 240ppi 320ppi 480ppi ,也就是说如果屏幕的ppi为320,那么就会优先使用drawable-xhdpi目录下的
图片资源。当然手机屏幕的ppi也是多种多样,例如有的是 300ppi,有的是220ppi,这个系统会选择最接近的目录,也就
是 300ppi的手机会选择320ppi对应的drawable目录下的资源
方法三:方法2中需要为每个drawable目录都生成对应的图片版本,如果图片较多的话,生成不同版本的图片倒是小事
更主要的缺点是会增大应用的大小,那么可不可以只在一个目录下存放图片,例如只在drawable-mdpi目录下存放图片呢
答案是可以的,假设我们在drawable-hdpi(对应的ppi为160ppi)目录下存放了一个100X100的图片,那么当图片需要
在320ppi的android设备上进行显示时,android系统会将自动将图片进行处理生成一个200X200的图片显示到设备上,那么他们占用的空间大小分别为 100/160 = 3/5 inch 200/320 = 3/5 inch 可以看出他们占用的长和宽都是一样的
这种自动缩放的优点是只需要一张图片就能适应各种ppi类型的屏幕。缺点是当对100X100的图片进行变换成200X200
的图片时肯能会造成图片的不清晰,如果提供一个drawable-xhdpi下的图片资源,图片较多的话会无形增加应用的大小,
所以说如何进行选择也是一个衡量。建议是将比较重要的图片资源提供多个版本(当android设备和自己的ppi相对应的
drawable下找到想要的资源时,就不会再到其他目录需找资源)。不是很重要的图片资源存储一个版本,让系统根据自
己的ppi自己对图片进行适当的缩放显示。
3、最后再说下为什么在布局文件中使用 dp作为单位而不是使用px
dp是一个与屏幕ppi无关的参数,同时也是一个事实上并不存在的虚拟单位。显示时会根据具体屏幕的ppi进行像素的
映射,关系如下
160ppi 1dp 1px
120ppi 1dp 0.75px
240ppi
1dp 1.5px
320ppi 1dp 2px
因此在布局文件中一般使用dp作为单位,这样就能适应不同ppi的屏幕,在各种ppi的屏幕上有一样大的物理上的距离。
(可以看出1dp并不总是等于1px的,对于ppi高的屏幕肯能要等于2px,只是为了物理上看起来的距离是相等的)
最后希望大家能够明白 我们经常说的分辨率和ppi的关系,其实他们是没多大关系。分辨率只是说明屏幕上有多少个
像素点,这也跟屏幕大小有关系。当然对于屏幕大小相同的来讲 分辨率越高 ppi越大,如果脱离了屏幕的物理尺寸谈
分辨率是没有任何意义的。就像平板的分辨率比手机的大,那是因为平板个大呀。从颜色显示的细腻程度上讲并不见得比手机强。
如果有说的不清楚的地方请读者指出,一起讨论研究,谢谢!