Android适配总结

做Android适配的同学们头疼的一件事就是机型的适配了,因为Android系统开源的缘故,市面上有太多太多的手机型号,厂商私自定制rom,不同的屏幕尺寸,不同的屏幕分辨率,不同的系统版本不同的API,都给Android工程师们带了五花八门的适配难题。本文尝试对常见的适配问题及解决方案做一个归纳总结。

系统版本适配

这应该是相对最好解决的一类适配问题。因为Android系统的演进,有些旧的API过时了被丢弃,而又有些新的API被引入进来。如果开发中不注意,比如,app目标最低sdk版本是14,但是其中调用了level 23才引入的API,则会造成app崩溃。

解决这类问题的办法也很简单,判断Android系统版本,针对不同的版本调用不同level的API。Build类中的

Build.VERSION.SDK_INT可以获取当前系统的版本,将它与期望的目标版本标即可。

ROM适配

因为Android是一个开源的系统,所以很多厂商机会都会对rom进行深度定制,这又给做Android app开发的同学们带了很多烦恼。你加班加点的要解决的,可能是一个在其它手机上都正常,但是在某个厂商的某个特定机型上就会崩溃的bug(同一厂商的不同机型都可能存在这样的问题……)。
因为市面上的机型如此之多,在实验室测试时是不可能涵盖所有机型的。针对rom的问题,首先需要建立app的log收集系统,在崩溃发生时记录厂商,机型,崩溃栈等信息,并上报的服务器。从统计信息中就可以通过分析log定位问题了。如果确定是只有某一特殊机型的问题,那么,要么修改代码,采用该机型可以适配的通用方案,或者,在原有方案的基础上,针对该机型增加特例方案。
Android获取厂商和设备信息的API: android.os.Build.MANUFACTURER,android.os.Build.MODEL。

屏幕适配

这将是本文的重点,也是Adroid开发中需要重点解决的适配问题。

支持不同大小的屏幕

合理使用wrap_content,match_parent。

尽可能的使用RelativeLayout。

针对不同尺寸的屏幕,使用不同的布局文件:

res/layout/main.xml

res/layout-large/main.xml

合理使用.9图片。

支持不同屏幕密度的设备

1.使用与屏幕密度无关的单位——dp,sp。
dp的定义如下:
Density-independent pixel (dp)独立像素密度。标准是160dip.即1dp对应1个pixel,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应 的像素点越多。 
上面的公式中有个dpi,dpi为DPI是Dots Per Inch(每英寸所打印的点数),也就是当设备的dpi为160的时候1px=1dp;

dp在适配中的作用是:在布局文件写某个View的宽和高为160dp*160dp,这个View在任何分辨率的屏幕中,显示的尺寸大小是大约是一致的(可能不精确),大概是 1 inch * 1 inch。
dp能够让同一数值在不同的分辨率展示出大致相同的尺寸大小。但是当设备的尺寸差异较大的时候,就无能为力了。适配的问题还需要我们自己去做,于是我们可能会这么做:
<?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时间的。如果提前针对不同设备准备不同的图片,就可以尽可能的省去这个过程。当然,代码是增加了包的尺寸。空间和时间,总是一对对立的矛盾统一。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值