Open zgq105 opened 5 years ago
由于安卓系统的开发性,因此很多厂商对Android系统和硬件进行定制和改造。因此,市面上就出现了众多不同厂商、不同尺寸的手机、平板和一些其他终端设备。随着安卓系统的不断发展,碎片化是越来越严重,主要体现在Android系统的碎片化、手机厂商的碎片化、屏幕尺寸的碎片化、分辨率大小的碎片化等等。所以,在安卓的开发过程中,屏幕的适配变得非常的迫切。
像素(Pixel)是指终端屏幕的最小构成单元,是一种尺寸的度量单位。1px=1像素点,一般的UI设计人员也是以px为统一的度量单位出设计图。
分辨率是指手机在横向、纵向上的像素点数总和 ;一般描述成宽高 ,即横向像素点个数 纵向像素点个数(如1080 x 1920)。
屏幕尺寸指手机对角线的长度,单位是英寸(inch),1inch=2.54cm,常见的手机尺寸有4.7、5.0、5.5、6.0等等。
屏幕像素密度指每英寸的像素点个数;比如,每英寸有160个像素点,那么屏幕像素密度就是160dpi。
一般手机的分辨率是宽x高,屏幕大小以寸为单位,那么三者的关系是:
密度无关像素(density-independent pixel)指与终端的实际像素点无关。
独立比例像素(scale-independent pixel),表示一种可缩放的字体大小,叫sp或sip。单位是sp,一般12sp、14sp、16sp、18sp等,一般使用偶数,防止精度丢失。
sp 与 dp 的区别:
3.2之前使用small、normal、large、xlarge来修饰布局文件夹,比如,在大屏幕手机中使用的布局文件 为/res/layout-large/main.xml。
android3.2之后引入了Smallest-Width限定符,比如,/res/layout-sw600dp/main.xml表示最小屏幕宽度大于等于600dp时使用该布局。
为了解决布局文件同名的问题,于是就有了布局别名,比如在/res/values-sw600dp/layouts.xml中定义指定加载对应的布局文件。如下所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <item name="activity_main" type="layout">@layout/activity_main_2</item> </resources>
屏幕方向限定符指的是根据当前手机是出于横屏状态还是竖屏状态,从而加载对应的布局文件,如下所示:
代码适配指在运行过程中动态获取屏幕宽度进行测量,然后按照需求进行设置,主要使用的API是DisplayMetrics 。
宽高限定符适配又称百分比适配,主要的思想是选择一种分辨率类型为基准,然后将宽高分成若干份,比如以480x320为基准分辨率:
smallestWidth适配指根据配置指定dp修饰的文件夹去匹配对应文件夹下的资源文件,和上面的宽高限定符适配的思路是一样的,不过这种方案的容错机制好,比如找不到完全匹配的dp文件夹,安卓系统会找最近的dp文件夹,这样就能保证适配的效果不会出现比较大的差异。 比如以/res/values-sw360dp为例,如下图: 这种方案适用Android3.2以后的版本,现在市面上的手机至少是4.0后的了,因此可以说是一种比较完美的解决方案。
今日头条适配方案主要思想是在运行过程中动态修改density值,强行把所有不同尺寸分辨率的手机的宽度dp值改成一个统一的值,这样就解决了所有的适配问题。 GitHub地址
SW和今日头条对比:
1. 为什么要进行屏幕适配?
由于安卓系统的开发性,因此很多厂商对Android系统和硬件进行定制和改造。因此,市面上就出现了众多不同厂商、不同尺寸的手机、平板和一些其他终端设备。随着安卓系统的不断发展,碎片化是越来越严重,主要体现在Android系统的碎片化、手机厂商的碎片化、屏幕尺寸的碎片化、分辨率大小的碎片化等等。所以,在安卓的开发过程中,屏幕的适配变得非常的迫切。
2. 屏幕适配相关概念
2.1 像素(px)
像素(Pixel)是指终端屏幕的最小构成单元,是一种尺寸的度量单位。1px=1像素点,一般的UI设计人员也是以px为统一的度量单位出设计图。
2.2 分辨率
分辨率是指手机在横向、纵向上的像素点数总和 ;一般描述成宽高 ,即横向像素点个数 纵向像素点个数(如1080 x 1920)。
2.3 屏幕尺寸(in)
屏幕尺寸指手机对角线的长度,单位是英寸(inch),1inch=2.54cm,常见的手机尺寸有4.7、5.0、5.5、6.0等等。
2.4 屏幕像素密度(dpi)
屏幕像素密度指每英寸的像素点个数;比如,每英寸有160个像素点,那么屏幕像素密度就是160dpi。
2.5 屏幕尺寸、分辨率、像素密度三者关系
一般手机的分辨率是宽x高,屏幕大小以寸为单位,那么三者的关系是:
2.6 密度无关像素(dp)
密度无关像素(density-independent pixel)指与终端的实际像素点无关。
2.7 独立比例像素(sp)
独立比例像素(scale-independent pixel),表示一种可缩放的字体大小,叫sp或sip。单位是sp,一般12sp、14sp、16sp、18sp等,一般使用偶数,防止精度丢失。
sp 与 dp 的区别:
3. 屏幕适配方案
3.1 布局适配
3.1.1 关于布局组件的适配
3.1.2 关于布局的适配
3.1.2.1 使用Size限定符
3.2之前使用small、normal、large、xlarge来修饰布局文件夹,比如,在大屏幕手机中使用的布局文件 为/res/layout-large/main.xml。
3.1.2.2 最小宽度限定符
android3.2之后引入了Smallest-Width限定符,比如,/res/layout-sw600dp/main.xml表示最小屏幕宽度大于等于600dp时使用该布局。
3.1.2.3 使用布局别名
为了解决布局文件同名的问题,于是就有了布局别名,比如在/res/values-sw600dp/layouts.xml中定义指定加载对应的布局文件。如下所示:
3.1.2.4 使用屏幕方向限定符
屏幕方向限定符指的是根据当前手机是出于横屏状态还是竖屏状态,从而加载对应的布局文件,如下所示:
3.2 图片适配
3.3 代码适配
代码适配指在运行过程中动态获取屏幕宽度进行测量,然后按照需求进行设置,主要使用的API是DisplayMetrics 。
4. 第三方适配框架
4.1 宽高限定符适配
宽高限定符适配又称百分比适配,主要的思想是选择一种分辨率类型为基准,然后将宽高分成若干份,比如以480x320为基准分辨率:
4.2 smallestWidth适配
smallestWidth适配指根据配置指定dp修饰的文件夹去匹配对应文件夹下的资源文件,和上面的宽高限定符适配的思路是一样的,不过这种方案的容错机制好,比如找不到完全匹配的dp文件夹,安卓系统会找最近的dp文件夹,这样就能保证适配的效果不会出现比较大的差异。 比如以/res/values-sw360dp为例,如下图: 这种方案适用Android3.2以后的版本,现在市面上的手机至少是4.0后的了,因此可以说是一种比较完美的解决方案。
4.3 今日头条适配方案
今日头条适配方案主要思想是在运行过程中动态修改density值,强行把所有不同尺寸分辨率的手机的宽度dp值改成一个统一的值,这样就解决了所有的适配问题。 GitHub地址
5. 小结
SW和今日头条对比: