做Android适配的同学们头疼的一件事就是机型的适配了,因为Android系统开源的缘故,市面上有太多太多的手机型号,厂商私自定制rom,不同的屏幕尺寸,不同的屏幕分辨率,不同的系统版本不同的API,都给Android工程师们带了五花八门的适配难题。本文尝试对常见的适配问题及解决方案做一个归纳总结。
系统版本适配
这应该是相对最好解决的一类适配问题。因为Android系统的演进,有些旧的API过时了被丢弃,而又有些新的API被引入进来。如果开发中不注意,比如,app目标最低sdk版本是14,但是其中调用了level 23才引入的API,则会造成app崩溃。
解决这类问题的办法也很简单,判断Android系统版本,针对不同的版本调用不同level的API。Build类中的
Build.VERSION.SDK_INT可以获取当前系统的版本,将它与期望的目标版本标即可。
ROM适配
屏幕适配
支持不同大小的屏幕
合理使用wrap_content,match_parent。
尽可能的使用RelativeLayout。
针对不同尺寸的屏幕,使用不同的布局文件:
res/layout/main.xml
res/layout-large/main.xml
合理使用.9图片。
支持不同屏幕密度的设备
上面的公式中有个dpi,dpi为DPI是Dots Per Inch(每英寸所打印的点数),也就是当设备的dpi为160的时候1px=1dp;
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- values-hdpi 480X800 -->
<dimen name="imagewidth">120dip</dimen>
</resources>
<resources>
<!-- values-hdpi-1280x800 -->
<dimen name="imagewidth">220dip</dimen>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- values-hdpi 480X320 -->
<dimen name="imagewidth">80dip</dimen>
</resources>
为了优质的用户体验,依然需要去针对不同的dpi设置,编写多套数值文件。可以看出,dp并没有能解决适配问题。
2.使用百分比
做过web开发的同学都知道,宽度,高度,margin,padding等等和尺寸有关的属性,都可以使用百分比。这样就非常灵活了,所以,web机会不存在适配的
问题(其实也存在,不同浏览器,以及不同移动设备的适配)。But,在Android不支持百分比的时候。。。实现类似百分比的功能,可能需要1、代码去动态计算;2、利用weight(weight必须依赖Linearlayout,而且并不能适用于任何场景)。
不过,目前Google也已经提供了官方的解决方案,这里有个栗子:https://github.com/JulienGenoud/android-percent-support-lib-sample。
其实,上文提到的使用match_parent,也是个百分比的例子——100%。
3. 对不同分辨率提供不同的图片
这不单可以解决适配的问题,同时能提高性能。如果对所有设备都提供一套图片,Android系统本身提供了机制,在加载图片的时候,会根据目标设备对图片进行适当的缩放,以获得最佳的显示效果。当然,如果设备尺寸差别较大,显示效果就不理想了。同时,这个缩放的过程明显是要占用cpu,gpu时间的。如果提前针对不同设备准备不同的图片,就可以尽可能的省去这个过程。当然,代码是增加了包的尺寸。空间和时间,总是一对对立的矛盾统一。