为什么要进行Android屏幕适配

由于Android系统的开放性,任何用户、开发者、OEM厂商、运营商都可以对Android进行定制,于是导致:

1、Android系统碎片化:小米定制的MIUI、魅族定制的flyme、华为定制的EMUI等等

2、Android机型屏幕尺寸碎片化:5寸、5.5寸、6寸等等

3、Android屏幕分辨率碎片化:320x480、480x800、720x1280、1080x1920

4、当Android系统、屏幕尺寸、屏幕密度出现碎片化的时候,就很容易出现同一元素在不同手机上显示不同的问题。

为了保证用户获得一致的用户体验效果:

使得某一元素在Android不同尺寸、不同分辨率的手机上具备相同的显示效果

我们看一下Android屏幕适配最主要的原因:

是由于Android手机的分辨率和尺寸千奇百怪,虽然Android官方提供了dp单位来适配,但其在各种奇怪分辨率下表现却不尽如人意。

主要是由于在界面在渲染绘制时,android会将dp转为px,在转换过程中是需要dpi的(上篇文章中有提到),而dpi是根据屏幕真实的分辨率和尺寸来计算的,每个设备都可能不一样的,从而导致显示问题。

先从两个大方面阐述一下Android的屏幕适配:

一、Android屏幕适配的发展

1、dp直接适配

2、宽高限定符适配

3、UI适配框架Autolayout

二、目前最好的适配方案

1、SmallestWidth适配(sw限定符适配)

2、今日头条适配方案

3、AutoSize

一、Android屏幕适配的发展

1、dp直接适配

Android推荐使用dp作为尺寸单位来适配UI,通过dp加上自适应布局和weight比例布局可以基本解决不同手机上适配的问题,这基本是最原始的Android适配方案。

缺点:

(1)这种方案只能保证我们写出来的界面适配绝大部分手机,部分手机仍然需要单独适配,但dpi的不同,还是会存在差异。

(2)一般的设计稿都是以px为单位的,所以我们在写layout文件的时候需要将px转为dp,影响开发效率。

2、宽高限定符适配

为了高效的实现UI开发,出现了新的适配方案,我把它称作宽高限定符适配。简单说,就是穷举市面上所有的Android手机的宽高像素值,设定一个基准的分辨率,其他分辨率都根据这个基准分辨率来计算,在不同的尺寸文件夹内部,根据该尺寸编写对应的dimens文件

缺点:这个方案有一个致命的缺陷,那就是需要精准命中才能适配,比如1920x1080的手机就一定要找到1920x1080的限定符,否则就只能用统一的默认的dimens文件了。而使用默认的尺寸的话,UI就很可能变形,简单说,就是容错机制很差。

3、UI适配框架Autolayout

鸿洋大神的作品,使用也超级简单,核心功能就是在绘制的时候在onMeasure里面做变换,重新计算px。

缺点:我们自定义的控件可能会被影响或限制,可能有些特定的控件(框架没有做适配的控件),需要单独适配。

小结:上述几种适配方案都是实际开发中用过的方案,但随着技术不断的更新,出现了更好的适配方案。

二、目前最好的适配方案

实现原理:Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。

sw限定符适配和宽高限定符适配类似,区别在于,前者有很好的容错机制,如果没有value-sw360dp文件夹,系统会向下寻找,比如离360dp最近的只有value-sw350dp,那么Android就会选择value-sw350dp文件夹下面的资源文件。这个特性就完美的解决了上文提到的宽高限定符的容错问题。

优点:1.非常稳定,极低概率出现意外

2.不会有任何性能的损耗

3.适配范围可自由控制,不会影响其他三方库

缺点:就是多个dimens文件可能导致apk变大,几百k。

实现原理:修改系统的density值(核心)

今日头条适配是以设计图的宽或高进行适配的,适配最终是改变系统density实现的。

过程:

优点:使用成本低,侵入性低,修改一次项目所有地方都会适配,无性能损耗

缺点:

1.只需要修改一次 density,项目中的所有地方都会自动适配,这个看似解放了双手,减少了很多操作,但是实际上反应了一个缺点,那就是只能一刀切的将整个项目进行适配,但适配范围是不可控的。

2.这个方案依赖于设计图尺寸,但是项目中的系统控件、三方库控件、等非我们项目自身设计的控件,它们的设计图尺寸并不会和我们项目自身的设

AndroidAutoSize 是基于今日头条适配方案,该开源库已经很大程度上解决了今日头条适配方案的两个缺点,可以对activity,fragment进行取消适配。也是目前我的项目中所使用的适配方案。

使用也非常简单只需两步:

(1)引入:

implementation 'me.jessyan:autosize:1.1.2'

(2)在 AndroidManifest 中填写全局设计图尺寸 (单位 dp),如果使用副单位,则可以直接填写像素尺寸,不需要再将像素转化为 dp。

目前在开发中用dp进行适配,在很多机型上都能很好的使用,针对个别分辨率无法满足适配要求,就只能对针下药了。

大家也可参考这篇文章:

Android适配最全面的解决方案

android 屏幕适配框架,Android屏幕适配相关推荐

  1. android媒体播放框架,Android 使用超简单的多媒体播放器JiaoZiVideoPlayer

    在之前的项目中用到了视频播放的功能,在网上看了看使用了大家用的比较多的一个开源项目JiaoZiVideo可以迅速的实现视频播放的相关功能. JiaoZiVideo的简单使用 集成了JiaoZiVide ...

  2. Android PDF阅读框架/Android PDF框架简单使用,简单快速集成简易的PDF阅读器 ,AndroidPdfViewer框架简单使用。

    文章目录 1:前言 使用步骤 步骤1 导包 / 导引用 / 添加依赖 步骤2 更改xml布局文件 步骤3 java文件处理 1:前言 因为前段时间项目展示,我们小组本打算做的是TXT阅读框架,但是找了 ...

  3. android svg动画框架,Android实现炫酷SVG动画效果

    svg是目前十分流行的图像文件格式了,svg严格来说应该是一种开放标准的矢量图形语言,使用svg格式我们可以直接用代码来描绘图像,可以用任何文字处理工具打开svg图像,通过改变部分代码来使图像具有交互 ...

  4. android 观察者的框架,Android 架构师7 设计模式之观察者模式

    前言 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式. 观察者模式.png 观察者模式 被 ...

  5. android banner动画框架,Android Studio Banner轮播图使用

    现在恰好有个项目需要做个轮播图效果,这个需求也是很常见的需求,于是就做个笔记写一下实现过程 分为加载本地图片和网络图片 加载本地图片 第一步:先在build.gradle中加入banner和glide ...

  6. Android测试最新框架,Android单元测试-常见的方案比较

    前言 本文将介绍在Android Studio中,android单元测试的介绍和实现.相关代码托管在github上的AndroidJunitDemo中,涉及到的用例代码收集于google官方提供的测试 ...

  7. android使用 注解框架,Android实践 | 注解框架ButterKnife基本使用

    使用ButterKnife,我们可以不用写很多的findViewById()语句,以及通过getResources获取String.Color等资源,这可以让我们的代码更加简洁,使用起来也很方便.下面 ...

  8. android的自动布局框架,Android ConstraintLayout 构建自适应界面

    使用 ConstraintLayout 构建自适应界面 ConstraintLayout 可让您使用扁平视图层次结构(无嵌套视图组)创建复杂的大型布局.它与 RelativeLayout 相似,其中所 ...

  9. android 滑动标签框架,Android实现网易严选标签栏滑动效果

    Android实现网易严选标签栏滑动效果 发布时间:2020-10-13 00:13:46 来源:脚本之家 阅读:85 作者:wlkdb 标签栏是一个非常常见的控件,似乎也是一个比较简单的控件,但如果 ...

最新文章

  1. Django 模型成员2.2
  2. oracle系统级别启动数据库
  3. EF--Code First配置问题
  4. 安装php no permision,php安装过程中的No package ‘xxx’ found问题
  5. 第56课 九九乘法表 《小学生C++趣味编程》
  6. 13 PP配置-生产主数据-BOM相关-定义修正参数
  7. zoj 1676Network Wars(胡博涛论文题,01分数规划+最小割)
  8. 为什么要从vmware切换到kvm?
  9. java应用中如何连接dbproxy_GitHub - alchemystar/hero: 用c语言写的dbproxy
  10. 嵌入式 tomcat的使用
  11. 怎么防治计算机病毒,计算机病毒怎么防治
  12. “腾讯再有本事,也要出海讨生活”
  13. java判断邮箱格式
  14. fork炸弹c语言能否运行,Fork炸弹简析和应对方法
  15. PS教程:--虚线教程大全
  16. absolute、relative详解
  17. Swift - 使用EventKit操作提醒事项(2、新增、修改、删除提醒)
  18. 理论+实操:K8S搭建dns内部服务与控制器controlls五种模式
  19. 2019前端工程师的自检清单
  20. MAT之NSL:SOFM神经网络实现预测哪个样本与哪个样本处在同一层,从而科学规避我国煤矿突水灾难

热门文章

  1. 【visdom绘图】深度学习中Visdom绘图的总结
  2. C++中的trivial和non-trivial构造/析构/拷贝/赋值函数及POD类型
  3. Python selenium+pyautogui写的一个12306抢票
  4. Android 9.0 Adaptive Icon 圆形图标剪切不全问题(上下左右部分被裁减)
  5. iOS进阶课程-iCloud编程-关东升-专题视频课程
  6. 祁文之恋——离开你的第五天
  7. vue Echarts 填坑记(Echarts数据量大,导致浏览器卡顿)
  8. cad dwg文件在线展示平台源代码cad格式 dwg文件解析
  9. Datawhale7月组队学习task4数据可视化
  10. Kubernetes网络插件对比分析(Flannel、Calico、Weave)