// 从做过的项目中做的一些屏幕适配学到了一些东西,进行一下总结.
1、理解几个名词
dip:设备独立像素,不同设备有不同的显示效果,和硬件设备有关。 不依赖像素.
dp: 同dip
sp:(scaled)放大像素,一般用于定义字体大小(google官方推荐).
dpi:每英寸的像素数量.
density:密度
ldpi 低密度 120dpi
density=0.75
mdpi 中密度 160dpi
hdpi 高密度 240dpi
xhdpi 超高密度 320dpi
density=2
xxhdpi 超超高密度 480dpi
xxxhdpi 超超超高密度 640dpi
2、不同尺寸屏幕文字大小的显示
布局页面内容(图片,文字)不同尺寸屏幕下的大小显示不同:
在每个文件加中都放置一套dimens.xml 文件。
dimens.xml 中的适配问题:(不同屏幕字体显示大小不同)
854*480的屏幕,会寻找 844*480,
不会寻找844*481 的values文件夹。
不会寻找855*479.
也不会寻找855*480.
// 如果找不到刚好恰当的,就选择最近的长和宽都小于当前手机的values文件夹中dimens.xml 中定义的尺寸大小。
文件夹名称命名为:values-1200x800
3、不同尺寸屏幕图片大小的显示
在res目录下有 drawable, drawable-ldpi, mdpi, hdpi, xhdpi, xxhdpi, 图片放在这些文件夹中是有区别的。
google在设计screen fit 的时候使用自动渲染机制:
Android SDK会自动屏幕尺寸选择对应的资源文件进行渲染,如SDK检测到你手机dpi是160的话会优先到drawable-mdpi文件夹下找对应的图片资源,注意只是优先,假设你手机dpi是160,但是你只在xhpdi文件夹下有对应的图片资源文件,程序一样可以正常运行。所以理论上来说只需要提供一种规格的图片资源就ok了,如果只提供ldpi规格的图片,对于大分辨率的手机如果把图片放大就会不清晰,所以需要提供一套你需要支持的最大dpi的图片,这样即使用户的手机分辨率很小,这样图片缩小依然很清晰。
如果你在xhdpi文件夹下放了一张图片a.png(100*100), xhdpi的设备会去该文件夹下找这张图并原样显示。但是如果是hdpi的设备就会去hdpi文件夹下面找图片,但是没有找到,只能使用hdpi文件夹下面的图片,会根据density计算并缩放。(1.5/2) * 100 = 75, 所以,在hdpi的设备中显示的大小应该是75*75px。
http://blog.csdn.net/singwhatiwanna/article/details/19139013 中有一张表格总结的非常好,可以参考一下。
// 我们设计图片最好提供当下流行的分辨率进行设计,这样能够达到比较好的效果(适当放大缩小图片不会严重走样)。 当然,你可以对各种分辨率设计一套图(UI设计师会愤怒的... ),但这样打包成apk会增大很多,并不可取。
4、延伸问题
因为在Android中,相同dip在所有mdpi设备上虽然像素数量是一样的,但是因为各设备dpi不一样,所以在最终的显示尺寸上是有微弱差别的。
如:165.2 PPI,根据android归一化原则(取值有160,223,240,320,480,640),归一到160dpi即 mdpi一类。计算屏幕像素密度的时候单位是PPI,计算完了归一化。
如何获取你使用的手机的具体的物理尺寸大小?
这个问题暂时还没有解决,如果解决之后我会补上。 你若有什么好的办法请告诉我,谢谢~
-------------------------------------------------------------------------------------------------------------------------------------------
腾讯QQ团队重点按照以下的方式来做不同适配:
1、布局文件xml不使用像素等单位,也尽量不在xml文件中设置尺寸,根据不同分辨率定义几套dimens文件,从而在布局文件里引用dimens文件里已经定义好的尺寸。
2、图片需要美工针对高低分辨率做两套图,如果是填充背景型的图片,用.9格式;
3、代码特别是自定义控件绘制时避免使用硬编码,应该引用dimens文件中的尺寸。
具体情况我们可以反编译QQ的apk文件看一下布局。
// 上面说的实际上只是一些基本的屏幕适配注意点,想把项目适配做的非常好并不是一件容易的事情,以后在开发过程中有什么新的问题及解决办法我会继续补充。