安卓屏幕适配方案(2015终极版)
- 安卓屏幕适配的重要性不用多说,OpenSignalMaps发布安卓碎片化报告指明到2014年,支持Android的设备共有18796种。安卓和ios不同,ios的设备只有几种,安卓设备太多,屏幕的分辨率也多,你不可能在app中定义所有的layout分辨率文件,这样会导致app过大,博主参考了10篇以上的博客,最后结合自己的经验来写这篇博客, 不足之处希望大家多多批评
- 首先介绍一下常见的屏幕分辨率,博主接触的手机不多,所以接下来使用三种分辨率进行测试
1.480x800
2.800x1280
3.1280x720
这个博客可以帮助很好的理解一些基本概念 - 安卓屏幕适配的黄金原则:
1.声明最小支持分辨率:这是谷歌官方的建议,因为在各个微博里面只有一个微博提到了这个,实用性可能不是很高,所以我没有进行实际测试
2.在layout文件中设置空间尺寸应该采用fillparent,matchparent和wrapparent,dp和sp
3.不使用绝对布局,尽量使用相对布局,
4.对不同的屏幕提供合适大小的图片 - 使用9-patch图片:由于博主不是很了解这个部分,所以大家可以参考一下这两个博客
参考使用自动拉伸位图部分 - 彻底解决的方法:这个部分特别多,大家参考一下这个博客的部分
具体如何来实现呢?我们看下面的代码: - 简化版的方法:彻底解决的方法很好,但是如果区分平板或者横竖屏可能存在不足,所以这里介绍一下我最喜欢用的方法:线性布局。上面的方法采用的方法本质上就是自定义分辨率,每个dp的内容,但是一般情况下我们可能根本用不到这么多的内容,也不需要如此详细的划分,例如QQ的底部菜单栏,三个按钮,简单使用线性布局进行比重weight的设置,就可以保证适配,看下面这段代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<EditText android:id="@+id/EditText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"/>
<EditText android:id="@+id/EditText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/EditText1"/>
<ImageView android:id="@+id/im"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginTop="10dp"
android:layout_centerHorizontal="true"
android:src="@drawable/th_sod"
/>
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" >
<Button
android:id="@+id/button1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="消息"
android:gravity="center"
android:drawableTop="@drawable/th_sod"/>
<Button
android:id="@+id/button2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="好友"
android:gravity="center"
android:drawableTop="@drawable/th_sod"/>
<Button
android:id="@+id/button3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="contact"
android:gravity="center"
android:drawableTop="@drawable/th_sod"/>
</LinearLayout>
</RelativeLayout>
下面是三种分辨率下的显示效果
之前有定义过一个登陆按钮,结果导致在1280x800的情况下出现了按钮个底部菜单重叠的问题,所以删掉了,现在说一下这种方法可能出现的问题:
1.图像可能会出现问题,里面的imageview我定义的是正方形,所以看起来还好,如果是一个长方形可能就比较奇怪,所以圆形的图像是非常好用的,为什么头像用的全是圆形
2.排版可能出现问题,之前有在密码框下面定义login按钮,设置了margintop结果按钮在平板模式下,login的按钮和底部菜单重叠
3.文字位置的问题,注意底部按钮的gravity属性,不要因为被拉伸导致文字偏左偏右的不协调感。
这个方法目前没有发现什么特别重大的问题,觉得唯一可能出现的问题就是在图片,不同分辨率的图片被拉伸之类的问题,可以参考这篇博客反汇编得到的qq,微信之类的布局(找不到这篇博客了,用文本列出来吧 ==)由于没有各种清晰度的图片,所以我也没有办法测试下去。
由于时间紧张我也没有进行帧布局的测试,希望感兴趣的可以测试一下,推想问题应该不大。还有一个就是黄金比例的测试。
谢谢大家观看这个帖子,如有不足请多多指教。