android 屏幕适配框架,Android屏幕适配

2023-11-03

为什么要进行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文件

467d4ee7f5fb

缺点:这个方案有一个致命的缺陷,那就是需要精准命中才能适配,比如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实现的。

过程:

467d4ee7f5fb

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

缺点:

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

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

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

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

(1)引入:

implementation 'me.jessyan:autosize:1.1.2'

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

467d4ee7f5fb

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

大家也可参考这篇文章:

Android适配最全面的解决方案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 屏幕适配框架,Android屏幕适配 的相关文章

  • 留言簿怎么用?

    看不到别人留言 自己也没法写留言 囧rz
  • React之antdesign官网虚拟列表(Table组件)二次封装

    1 功能介绍 建议 官网链接 建议 走一遍官网的虚拟列表 最好走通 官网虚拟列表功能都有 但是 官网虚拟列表里面跟之前表格 ant table tbody 相关的功能都无了 因为这块官网是整体替换了 ant table tbody 这一级的
  • 流形学习的解释

    作者 知乎用户 链接 https www zhihu com question 24015486 answer 194284643 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 最近发现我的这篇回答被人洗稿
  • 七天玩转Redis

    文章目录 Redis 事务 1 正常执行事务 2 取消事务执行 3 事务编译时异常 4 运行时异常 5 Redis乐观锁 Redis 事务 什么是事务 事务是一个单独的隔离操作 事务中的所有命令都会序列化 有顺序地执行 事务在执行的过程中
  • 数据结构-队列(链队列与循环队列)

    目录 队列的概念及结构 概念 结构 链队列 初始化QueueInit 销毁QueueDestroy 入队QueuePush 出队QueuePop 队头元素QueueFront 队尾元素QueueBack 队列长度QueueSize 判断是否
  • C/C++性能测试工具---Valgrind

    一 valgrind memcheck 内存错误检测器 可以检测下列与内存相关的问题 未释放内存的使用 对释放后内存的读 写 对已分配内存块尾部的读 写 内存泄露 不匹配的使用malloc new new 和 free delete del
  • Python:Using TensorFlow backend.

    声明 先说个故事吧 有一个农夫想制作一套农具 就买来一些工具 但是有了工具依然不会用 就去找别人帮忙 有一个人教给农夫一套方法 农夫高兴地就回家了 结果农夫发现 用这个人给的方法 跟自己的工具不匹配 然后就跟别人说这个人害人不浅 为什么要说
  • 医疗图像三维重建方法小结(python+VTK+ITK+Mayavi)

    医疗图像三维重建forpython 环境简介 方法 方法一 Poly3DCollection matplotlib 方法二 VTK ITK 方法三 Mayavi之contour3d 最终方法Mayavi TVTK 环境简介 语言是pytho
  • 如果让你自己设计一个分布式架构的中间件系统,该怎么做?

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 1 Master Slave架构 2 异步日志持久化机制 3 检查点机制 定时持久化全量数据 4 引入检查点节点 5 总结 思考 这篇文章 给大家来聊一个生产级
  • git cherry-pick 拣选命令——重放提交

    git cherry pick 拣选命令 重放提交 语法 描述
  • (二)基于演示介绍一些技术要点

    1 解决方案目录结构 2 各模块的依赖关系图 3 基于以上的架构的Web端访问数据库的方式 4 从实体类成员到界面控件的转换 实体类 gt 数据表 根据实体类字段数据类型以及Attribute来决定表字段名 类型 主外键 进而形成完整的数据
  • 织梦搜索结果页文档标题标红引起样式错乱解决方法

    在搜索结果页模板search htm中 dede list dede list 里凡是有 alt field title 和 title field title 把里面的 field title 标题标签改成 field title fun
  • 记录字节跳动前端面试,四轮技术面

    一面 笔试题 多刷字节题库 多考js编程题 两道算法题 基本时lotcode简单中等题 1 如果后端传给前端一个很大的数 前端会怎么处理 该怎么处理 分析 不能直接渲染 因为会使页面加载过慢 不利于用户体验 方法 采用懒加载 分页 前端维护
  • MySQL字段约束条件,外键约束条件,表关系

    目录 字符编码与配置文件 统一字符编码 存储引擎 修改存储引擎的方式 自定义选项存储引擎 不同存储引擎产生的表文件有几个 MERGE InnoDB Archive BLACKHOLE blackhole与memory存取数据的特征 Blac
  • Cookie 和 Session 归纳

    首先介绍下基本概念 cookie是服务器通知客户端让其保存健值对的一种形式 客户端有了cookie之后 每次请求就会发送给服务器 每个cookie最大是4kb 服务器创建cookie 1Cookie cookie new Cookie 创建
  • Jacoco代码覆盖率测试

    欢迎光临我的博客查看最新文章 https river106 cn 1 简介 JaCoCo Java Code Coverage 是一个开源的覆盖率工具 它针对的开发语言是java 其使用方法很灵活 可以嵌入到Ant Maven中 很多第三方
  • linux下nginx重启命令

    linux下的nginx重启命令常见以下3种 systemctl restart nginx service nginx restart usr sbin nginx s reload
  • 高职教育应对ChatGPT应用的策略

    一 完善顶层设计 提升技术水平 在推广ChatGPT平台的过程中 高职院校需要关注技术本身的问题 这就需要在国家和地方政府的引导下 引入更完善的技术顶层设计 提高人工智能在高职教育中的运用水平 具体来说 一方面需要出台更加高效的法规来确保我
  • Flink CDC 单线程读取 mysql binlog 同步到 Elasticsearch 的压力测试

    硬件环境 MySQL 服务器2核1G Flink 服务器2核4G Elasticsearch 服务器2核8G 软件版本 MySQL 5 7 35 Flink 2 12 1 14 2 Elasticsearch 7 1 0 flink sql

随机推荐

  • Github上传代码菜鸟超详细教程

    最近需要将课设代码上传到Github上 之前只是用来fork别人的代码 这篇文章写得是windows下的使用方法 第一步 创建Github新账户 第二步 新建仓库 第三部 填写名称 简介 可选 勾选Initialize this repos
  • 二分法(二)找到目标值开始位置和结束位置NUSOJ2677

    题目 现在给定一个升序排列的数组num t个目标值 现在你要做的便是找到目标值在数组中的开始位置和结束位置 如果数组中不存在该值 则返回 1 1 输入m Input 第一行输入一个n n 1 lt n lt 1e6 代表数组num长度 第二
  • 如何搭建一个完整的Vue3.0 + ts 的项目

    如何搭建一个完整的Vue3 0 ts 的项目 相信9月18日尤大大的关于Vue3 0的发表演讲大家一定有所关注 现在Vue3 0 也已经进入RC阶段 最终产品的候选版本 如果没有问题则可发布成为正式版本 所以Vue3 0的学习是我们必然的趋
  • matlab无人机路径规划,一种新的优化算法,天牛群算法,比蚁群算法效果好,收敛快

    matlab无人机路径规划 一种新的优化算法 天牛群算法 比蚁群算法效果好 收敛快 在tsp qap二次规划以及三维路径规划上有很好的效果 ID 51100647321750445tbNick id4mr
  • CSDN周赛58期后记,及往期题目记录

    本期周赛没什么bug 体验比较丝滑 提出表扬 咱也不能老吐槽不是 当然 丝滑的根本原因是题目比较水 尤其是最后一道 莫名其妙的键盘 两周前的 56 期刚刚考过 当真是莫名其妙而又迫不及待地又考了一遍 是怕大家背得不够熟吗 而从难度上看 这道
  • go语言安装环境

    go语言安装环境 1 安装包下载 2 安装 最好不要有中文路径 3 测试环境 cmd中输入 go version 回车 4 经典代码 保存文件名 hello go package main import fmt 包含println func
  • c++拆分string型字符串存到vector中

    对数据进行拆分放到vec中 void split string const std string str std vector
  • 关于IDEA无法启动常见的几个问题

    IDEA无法启动 常见的问题及解决办法 第一种 无法启动 大多是因为javaagent 那一行 这种比较简单 出现这种问题 大都是因为编辑vmoptions时出错造成的 这种只需要删除idea 的配置文件就行 一般默认在C盘 例如 C Us
  • Python requests“Max retries exceeded with url” error

    今天写python网络爬虫的时候遇到一个问题 报错的具体内容如下 HTTPConnectionPool host dds cr usgs gov port 80 Max retries exceeded with url ltaauth s
  • 机器学习——朴素贝叶斯、后验概率最大和极大似然

    朴素贝叶斯没有参数估计 给堆数据直接求 属于生成模型 不用优化模型求最佳参数 这区别于判别模型 我遇到的困惑 1 后验概率最大 和 极大似然 这二者有什么区别和联系吗 2 朴素贝叶斯和EM这二者有什么区别和联系吗 答案 1 朴素贝叶斯是根据
  • 怎么维护自己的电脑?

    方向一 我的电脑介绍 我使用的是一台来自知名品牌的笔记本电脑 它具有高性能的核心配置 如快速处理器 大容量内存和高性能显卡 以及宽敞的存储空间 我选择这台电脑主要是因为它的出色性能和可靠性 能够满足我在学习和工作中的需求 方向二 我的日常维
  • 数据分析Power BI数据建模教程(四)——如何创建计算度量值和计算表

    Power BI 是基于云的商业数据分析和共享工具 它能帮您把复杂的数据转化成最简洁的视图 通过它 您可以快速创建丰富的可视化交互式报告 即使在外也能用手机端 APP 随时查看 甚至检测公司各项业务的运行状况 只需它仪表板的一个界面就够了
  • 使用yum安装nginx,几步完成,超级简单!(亲测)

    1 安装yum utils工具包 sudo yum install yum utils 2 设置yum存储库 进入 etc yum repos d目录 cd etc yum repos d 创建nginx repo文件 vim nginx
  • AMIS + httplib 快速搭建前后端

    AMIS httplib 快速搭建前后端 1 简介 1 1 AMIS简介 1 2 httplib开源库 2 快速使用 2 1 AMIS环境搭建 2 2 创建一个登陆页面 2 3 利用httplib搭建简单的后端 2 4 运行 尾声总结 1
  • 基于python手动画出spectrogram(语谱图)

    Spectrogram是基于STFT变换得到的 非常有助于分析信号的时频特性 在语音信号处理中常被称为 语谱图 python中有一些写好的模块可以直接将时域的信号转化成spectrogram 但这并不利于对其原理的理解 而且横纵左边的转换也
  • Vue中token刷新及续期的功能实现

    在vue中如何实现token续期 刷新token 原因 最近公司项目有一个视频播放的功能 然后由于在测试环境登录时token过期时间较短导致一直在当前页面播放视频会出现token过期的现象 然后用户刷新会触发axios响应拦截器的操作退出系
  • Day01.二分查找、移除元素

    Day01 二分查找 移除元素 0704 二分查找 题目链接 0704 二分查找 思路 二分查找 仅对有序数组有效 每次需要数组的中间值 与目标值比较大小 如果中间值比目标值大 说明目标值位置在left与mid中间 区间缩小一半 同理 如果
  • 蓝桥杯试题联系

    题目 你有一架天平 现在你要设计一套砝码 使得利用这些砝码可以称出任意 小于等于 N 的正整数重量 那么这套砝码最少需要包含多少个砝码 注意砝码可以放在天平两边 输入格式 输入包含一个正整数 N 输出格式 输出一个整数代表答案 样例输入 7
  • 2D离散傅里叶变换及逆变换的matlab实现

    积分线性变换可以将信号或图像在更适合的域内表达 并且使得解决相关问题更容易 在图像分析中最常用的积分显示变换是傅里叶变换 离散余弦变换与小波变换 1d傅里叶变换由傅里叶 Fourier 提出 1d傅里叶变换将函数f x 变换到频率域F t
  • android 屏幕适配框架,Android屏幕适配

    为什么要进行Android屏幕适配 由于Android系统的开放性 任何用户 开发者 OEM厂商 运营商都可以对Android进行定制 于是导致 1 Android系统碎片化 小米定制的MIUI 魅族定制的flyme 华为定制的EMUI等等