android中图片适配是一件很棘手的事情,本篇文章详细的介绍屏幕显示的原理,为何会资源文件中会存在android
drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi等文件夹,为何要使用dp做为单位等等。api
首先从这两张图片的显示效果开始提及eclipse
这是一张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 越高的手机占用的空间就越小。这就是咱们想要图片在各类手机屏幕上都显示一致的效果时须要解决的问题。翻译
既然这种效果不是咱们想要的,怎么作才能获取一致的显示效果呢?下面介绍三种方法blog
方法一:对每一中不一样的ppi使用不一样的图片,这须要咱们先判断屏幕的ppi,再对图片进行处理,而后显示,显然比较麻烦。并且对于获取屏幕ppi这个参数android并无提供给咱们api调用。因此这种办法基本行不通图片
方法二: 在用eclipse开发环境生成一个android项目后,系统会给咱们生成drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi,drawable-xxhdpi,对于同一张图片资源,咱们分别建立这五个版原本适应不一样的屏幕。假设你想一张图片ip
在 200ppi和400ppi的手机上显示的长和宽都是同样的为 1inch x 1inch,那么你就须要制做一张200x200的图片和一张ci
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本身对图片进行适当的缩放显示。
最后再说下为何在布局文件中使用 dp做为单位而不是使用px
dp是一个与屏幕ppi无关的参数,同时也是一个事实上并不存在的虚拟单位。显示时会根据具体屏幕的ppi进行像素的映射,关系以下160ppi 1dp 1px120ppi 1dp 0.75px240ppi
1dp 1.5px320ppi 1dp 2px所以在布局文件中通常使用dp做为单位,这样就能适应不一样ppi的屏幕,在各类ppi的屏幕上有同样大的物理上的距离。(能够看出1dp并不老是等于1px的,对于ppi高的屏幕肯能要等于2px,只是为了物理上看起来的距离是相等的)
最后但愿你们可以明白 咱们常常说的分辨率和ppi的关系,其实他们是没多大关系。分辨率只是说明屏幕上有多少个像素点,这也跟屏幕大小有关系。固然对于屏幕大小相同的来说 分辨率越高 ppi越大,若是脱离了屏幕的物理尺寸谈分辨率是没有任何意义的。就像平板的分辨率比手机的大,那是由于平板个大呀。从颜色显示的细腻程度上讲并不见得比手机强。