几种屏幕适配方案的优缺点分析

2023-11-08

前言

◾官方方案

◾宽高限定符:

◾AndroidAutoLayout:

◾今日头条方案

◾SmallestWidth

基本概念 ◾屏幕像素密度:

一块屏幕物理区域内像素数量越多像素密度越大,被称为dpi(每英寸所含像素数量)

◾像素无关密度(dp):

为什么提出: 同样屏幕大小的设备,像素点不同,如果用px做单位就会出现高分辨率下控件大,低分辨率下控件小的问题

官方方案

缺陷

设备的宽度的dpi有大有小

同样写200dp

左480dpi 右560dpi

宽高限定符适配

以某一个分辨率为基准

现在我们以320×480的分辨率为基准:

◾将屏幕的宽度分为320份,取值为x1~x320

◾将屏幕的高度分为480份,取值为y1~y480

注意事项: x160 表示的是3分之一 写一个正方形 不能用x160,y160,需要用x160,x160

缺点:xml文件过多(本身分辨率多,一些厂商rom可以显示隐藏虚拟按键,又增加了更多不同的分辨率),增加了apk大小

AndroidAutoLayout库

缺点:

1.支持的属性有限

◾layout_width

◾layout_height

◾layout_margin(left,top,right,bottom)

◾pading(left,top,right,bottom)

◾textSize

◾maxWidth, minWidth, maxHeight, minHeight

2.需要扩展很多view

今日头条的适配方案

density 的意思就是 1 dp 占当前设备多少像素

设备 1,屏幕宽度为 1080px,480DPI

因为在160dpi下 1dp =1px

所以480dpi下 1dp=3px

屏幕宽度就是 1080px/3=360dp

设备2

560dpi下 1dp=3.5px

屏幕宽度就是 1440px/3.5=411dp

可以看到屏幕的总 dp 宽度在不同的设备上是会变化的,但是我们在布局中填写的 dp 值却是固定不变的

在布局中我们写却写的是相同的dp

想象一下 同样写180dp两个view横着并排,第一个设备可以占满,第二个设备却还留着白边

所以要想做到写相同的dp 在不同宽度设备上 显示宽度百分比一致 就要将设备宽度统一

当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) = density

几个例子

假设设计图是375dp的, 则在375dp 的设计图中一个view 宽度为100dp

以 1080px 宽的设备为例 ,

设计图中

view 宽度占比 100/375=0.267

1080设备中

view宽 1080/375*100 =288px

所占比例 288px/1080=0.267

以1440px 设备为例

设计图中view 宽度占比 100/375=0.267

1440设备中

view宽 1440/375*100 =384px

所占比例 384px/1440=0.267

优势:

复杂度很低,表现优异

缺点:

引用了第三方库,而第三方库的设计图和我方设计图宽度差距非常大时,会导致比例偏差过大

举例说明:

第三方设计库750dp宽度的设计图

100dp的view 在设计图上仅占 100/750=0.133

经过修改density在设备上占比 则会是其 2倍 0.267

解决方案

1: 使用其他不常用尺寸 例如pt 计算公式对pt 使用,则对原第三方库中dp 不会产生影响, 比例偏差不会差距太大

2:以activity 为单位使用别的适配方案

SmallestWidth

宽高限定符的升级版

samlleest 最小宽度 含义是指 不管屏幕旋转与否 都取屏幕最小的一个边作为 最小宽度

两个公式

density=dpi/160

px/density=dp

以 1920 * 1080、480 dpi 为例

宽度为1080 则 dp 为 1080/480*160=360dp

则系统会取 values-sw360dp 文件夹下的dimens.xml

dimen的生成过程

以一个宽度为基准值 生成其他宽度

以360dp为例,屏幕分成了360份,则每一份所占dp如下图所示

生成400dp则是

这样可以保证所有设备中 dp_360都可以占满屏幕宽度,所使用的view占屏幕宽度的百分比也是一样的

即使没有精准适配也会找到最相近的values-swdp 文件夹,有误差但是仍可以较为完美的实现适配

缺点:

1.使用sp需要单独生成sp的文件

2.增加app体积,但这一点比宽高限定符要小得多

自动生成工具

github.com/wildma/Scre…

最后感谢观看

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

几种屏幕适配方案的优缺点分析 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • zabbix 钉钉&微信&企微告警(动作&操作&消息内容模板)

    一 环境配置 1 配置zabbix服务端 2 配置监控主机 监控项 监控模板 zabbix配置安装 this page is used to test the proper operation of 疯飙的蜗牛的博客 CSDN博客 二 触发
  • SRAMC spec

    SRAMC规范分析 AHB SRAMC这个项目是选取自SOC的一部分 通过AHB总线进行读写操作 实现了下面的功能 功能点 8个8x8k的设计 8 16 32位的读写 低功耗bank core选择 单周期读写 dft bist测试 模块 包
  • Docker 部署学习(三),构建redis服务,并启用密码认证(基于docker pull redis)

    参考 docker官方redis文档 1 有特殊版本需求的可以查看redis镜像tag版本 2 选择最新版 latest docker pull redis latest 3 启动容器并设置密码 docker run name redis
  • 活动预告丨易盾CTO朱浩齐将出席2018 AIIA大会,分享《人工智能在内容安全的应用实践》

    本文来自网易云社区 对于很多人来讲 仿佛昨天才燃起来的人工智能之火 转眼间烧遍了各个角落 如今我们的生活中 处处渗透着人工智能 10月16日 2018年 AIIA人工智能开发者大会在苏州举办 网易云易盾CTO朱浩齐将出席本次大会 AI安全分
  • springboot整合log4j

    1 log4j文件
  • Maven和Tycho

    点进来读这篇文章的朋友 我假定你已经知道maven的基本知识 也知道Eclipse 知道Eclipse是基于OSGi 初步了解Eclipse插件开发或者说OSGi模块化开发 如果对这些知识不了解 甚至完全没有听过 那请绕开本文 Maven简
  • mysql连接不上数据库

    1 打开 DOS 窗口 输入 mysql 连接命令时 提示报错 Cannot connect to MySQL server on localhost 10061 如下图 2 上面问题原因 可能是本地服务没开 需要开启本地服务 按 Win
  • 高考扎推报网络安全专业,非科班的你还在观望等机会流失吗?

    又是一年高考季 在等待成绩出来的这段时间 所有考生和家长都在积极地研究着专业报考这个大难题 尤其是理工科 选好一个专业是非常重要的 专业对于普通家庭的孩子来说就是你安身立命的根本 今年的就业形势让家长们都绷紧了神经 大家都对专业选择更加的慎
  • unity3d : unity Editor 已停止工作

    问题 安装unity后打开unity就会出现 unity Editor 已停止运行 原因 1 如果是ghost win7 系统 这个系统不稳定 可以重装 win7旗舰版试一试 2 看看你的系统是不是64位sp1 如果不是的话 请安装sp1后
  • ES的嵌套查询和嵌套聚合

    1 想要实现嵌套查询和嵌套聚合 首先需要在索引里面设置某个属性是嵌套类型 一般是List type nested 2 API的demo 嵌套查询 使用场景 需要根据list中的两个字段以and的关系进行查询 构造布尔查询 BoolQuery
  • 论文报告中如何优雅的粘贴代码(表格版)

    在经过前两天的课设摧残后 总结一个粘贴代码的小方法 这里用的是表格填充式 我觉得还算美观 如果你想代码像下面这样保持高亮的话 一共两个方法 第一个是去网站上做高亮代码 代码在线高亮工具 将高亮美化的代码一键粘贴到 Word 或 OneNot
  • http 一次跨域请求出现 OPTIONS 请求的问题及解决方法

    在正式跨域的请求前 浏览器会根据需要 发起一个 PreFlight 也就是Option请求 用来让服务端返回允许的方法 如get post 被跨域访问的Origin 来源 或者域 还有是否需要Credentials 认证信息 三种场景 如果
  • 第七课:MAC去中心化钱包开发之首页

    一 前言 在上一讲中 我们创建了钱包账户 备份了私钥 但是我们还是无法使用它 最基础的功能就是登录钱包 查看钱包资产 转账 查看转账记录等等 今天我们先把登录和首页搭建好 二 登录页面 用到的合约 验证账户密码合约 调用示例 不再粘贴所有代
  • idea 运行scala报错 Error compiling sbt component 'compiler-interface-2.13.1-52.0'

    idea 运行scala报错 Error compiling sbt component compiler interface 2 13 1 52 0 刚开始学习scala 在idea里创建普通的maven项目后 并且加了scala的插件等
  • react+UmiJS+Antd Pro简介

    这里写目录标题 一 项目初始化 二 基本了解 2 1 路由配置 2 2 Html模板 2 3 Mock数据 2 4 DvaJS 2 5 运行时配置 2 6 Umi UI 三 项目优化 3 1 配置项 3 1 1 config ts 3 1
  • NSJSONSerialization介绍

    ios5中apple增加了解析JSON的api NSJSONSerialization 网上已经有人做过测试 NSJSONSerialization在效率上完胜SBJSON TouchJSON YAJL JSONKit NextiveJso
  • git stash用法

    常用git stash命令 1 git stash save save message 执行存储时 添加备注 方便查找 只有git stash 也要可以的 但查找时不方便识别 2 git stash list 查看stash了哪些存储 注意
  • numpy上手笔记

    这是没整理的 要看就看图片 和代码中加注释的部分 代码都是抄书上的 太乱 我的心太乱 要一些空白 numpy的数据类型 定义数据 和数据类型 import numpy as np x np float32 1 0 y np int 1 2
  • 【深入理解计算机系统-学习笔记】第一章 计算机系统漫游

    第一章 计算机系统漫游 简介 我们通过跟踪hello程序的生命周期来开始对系统的学习 从它被程序员创建开始 到在系统上运行 输出简单的消息 然后终止 我们将沿着这个程序的生命周期 简单得介绍一些逐步出现的关键概念 专业数据和组成部分 hel
  • 几种屏幕适配方案的优缺点分析

    前言 官方方案 宽高限定符 AndroidAutoLayout 今日头条方案 SmallestWidth 基本概念 屏幕像素密度 一块屏幕物理区域内像素数量越多像素密度越大 被称为dpi 每英寸所含像素数量 像素无关密度 dp 为什么提出