Android 适配心得

Android 适配心得

1. 屏幕尺寸概念

关于这方面的文章很多,我这里就简单说明一下。一般Android都是用dp、sp代替px,从大部分情况上看,基本满足各屏幕的视觉效果一致。而如果出现了差异性,需要针对性调整,就需要对dp、sp值进行更改。这就进入到本文章主题,如何尽可能的去适配复杂的Android手机屏幕。一般UI根据主流分辨率屏幕作为基础画布,然后进行切图。

屏幕尺寸DPI对应项目中的限定符文件夹
HVGAmdpi
WVGAhdpi
FWVGAhdpi
QHDhdpi
720Pxhdpi
1080Pxxhdpi

2. 布局原则

1.1 使用dp、sp、dip表示布局大小、字体大小等。(dip=dp)
1.2 灵活布局,不要写死。尽量用wrap_content、match_parent、weight处理的,避免限定高宽带来的不同屏幕不一致问题。注意weight使用时会影响layout的布局性能,谨慎使用。
1.3 使用relativelayout、linearlayout等四种进行布局,绝对不用AbsoluteLayout。通过内外边距以及相对条件去控制布局,而不是一开始就写死的布局大小。
1.4 有条件的项目团队,让UI多切几张Icon图,以便适配不同分辨率的手机屏幕。
1.5 不要用特殊API下的xml属性去描述布局,避免不同版本手机出现问题。
总结:以上是基本适配,不增加太多成本的基础上,尽可能地处理手机适配问题。但是往往显示很残酷,所以接下来介绍如何进行特殊适配。

3. 适配方法

1.1 限定符的使用
限定符种类繁多,有尺寸、版本、屏幕方向、单双面板、屏幕密度、多语言适配、组合限定符等。
限定符大全:http://blog.csdn.net/ewrfedf/article/details/24359747

尺寸限定符:用来申明当前布局文件是否为特定尺寸大小才使用(经测试,似乎大于这个尺寸也会进行,具体看默认的layout文件夹)。比如在res下建立layout-480x320文件夹,此时再放入一个a.xml布局文件,在默认的layout文件夹下也有a.xml。当设备是480x320时,会加载layout-480x320文件夹下的a.xml。依照这种模式,我们可以在一些特殊尺寸的设备上,加载不同的布局文件,以便适配屏幕。

版本限定符:一般用来对系统控件、一些触摸效果、特殊布局等做特殊处理的适配。写法和原理类似上面,比如layout-v21,指在api21上采用该布局。

屏幕方向:一般我们都是固定竖屏,当然有时候做某些应用,需要横屏。但是横屏的布局格局肯定完全和竖屏不同,这时候用layout-land来表示横屏(port是竖屏屏幕)。然后在这个文件夹下的布局文件,你可以保持id不变的情况下,调整布局样式。

单双面板:layout-large或者sw600dp(宽度),sw最低尺寸限定符可以用来表示平板也可以单独用来申明当前布局最低哪个尺寸使用。一般用于平板设备与手机设备的过渡,手机由于屏幕的限制,一个屏幕显示的内容有限。而平板可以显示2个手机屏幕左右大小,这时候可以采用双面板。比如左边是列表名,右侧是具体内容详情这种设计。可以用2个fragment(一个列表、一个详情),声明一个布局文件a,在默认layout放置常规布局。而在双面板布局文件夹里的a设置2个fragment标签节点。在代码需要判断当前详情页的标签节点是否被加载,因为只有在平板上会加载这个特殊布局。

屏幕密度:xhdpi、mdpi等,这些都是常见的。在项目创建时,系统就提供了这种模式的适配方案。

多语言适配:values-en、values-es等,不同的后缀分辨代表不同语言,比如前面2种分别为英语和西班牙语,这样在做国际化app的时候特别方便。

组合限定符:即组合上述的限定符,一起使用。比如layout-sw600-v21,表示平板设备且api为21时使用(也可以说是宽度600dp以上的设备,一般600dp代表7英寸平板)

1.2 特殊图片格式
一般用.9图即9-patch图来做一些会被拉伸的图片的适配,比如聊天时候的气泡框,固定四个角,设置可拉伸区域,以便适应聊天内容的长短不一。
1.3 代码适配
代码适配,其实就是解决xml灵活度不够高的时候的备选方案。根据动态获取的屏幕高宽,对布局样式、显示风格进行代码控制,以达到UI设计的效果,且满足不同手机显示不同风格。比如根据宽度决定一行显示几个item,这时候就需要获取屏幕宽度来判断了。

//获取设备独立像素dp
DisplayMetrics metrics = new DisplayMetrics();
Display display = activity.getWindowManager().getDefaultDisplay();
display.getMetrics(metrics);

//不可取的方案
DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); //不准确
android.content.res.Resources.getSystem().getDisplayMetrics();//这个得到的宽和高是空的。

4. 实例分析

未完待续!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值