Android开发屏幕适配方案

2023-11-04

  由于Android系统的开放性,任何用户、开发者、硬件厂商和运营商都可以对Android系统和硬件进行定制,修改成他们自己所需要的样子。使得随着Android设备的增多,设备碎片化、系统碎片化、屏幕尺寸碎片化和屏幕碎片化的程度也在不断加深;

这种碎片化达到什么程度呢?

1、Android系统碎片化:基于Google原生系统,小米定制的MIUI(米粉一个)、华为定制的EMUI和魅族定制的Flyme等等;
2、Android机型屏幕尺寸碎片化:5寸、5.5寸、6寸和现在越来越流行的全面屏及刘海平等等;
3、Android屏幕分辨率碎片化:从一开始的310x480、慢慢发展到480x800、720x1280、1080x1920和1440x2560等等;

  当Android系统、屏幕尺寸、屏幕分辨率出现碎片化的时候,屏幕适配就成了一个亟需解决的问题!由于碎片化的存在,很容易出现同一元素在不同手机屏幕上显示不同的问题。为了保证用户获得一致的用户体验效果,使得某一元素在Android不同系统、不同尺寸、不同分辨率下的手机上能够具有相同的显示效果,能够保持界面上的效果一致,我们需要解决屏幕适配问题,需要对各种手机屏幕进行适配;

考虑 Android 屏幕适配方案之前,先了解一下相关知识点:
  像素(px):通常我们所说的像素,就是构成影像的最小单位,也就是手机屏幕的最小构成单元;单位为px(pixel),1px=1像素点;UI设计图片时会以px作为统一的计量单位;
  分辨率:手机屏幕在横向、纵向上的像素点数总和,一般描述成宽x高,如1080x1920,即横向像素点个数x纵向像素点个数;单位:同像素一样;
  屏幕尺寸(inch):手机对角线的物理尺寸;单位:英寸(inch),一英寸约等于2.54cm;
  屏幕像素密度(dpi):每英寸的像素点数,即每英寸内有多少像素点,如有160个,则像素密度为160dpi;单位:dpi(dots per inch);计算公式:像素密度 = 像素点数 / 尺寸(dpi = px / inch);标准屏幕像素密度(mdpi):即每英寸上有160个像素点(160dpi);

屏幕尺寸、分辨率和像素密度三者关系:

手机的分辨率是宽x高,屏幕大小是以寸为单位,得出:屏幕像素密度(单位/dpi)= 屏幕宽高的平方和,然后开方除以屏幕大小;

  密度无关像素(dp):即与手机终端上的实际物理像素点无关,可以保证在不同屏幕像素密度的设备上显示相同的效果,是Android特有的长度单位;单位:dp/dip(density-independent pixel);

密度无关像素(dp)与像素(px)的转换:1dp =(dpi / 160)x px;

  独立比例像素(sp):即Android开发时设置文字的字体大小的专用单位,按照用户首选的文本尺寸进行字体缩放(属于缩放无关像素);推荐使用偶数,不推荐使用奇数和小数,容易造成精度丢失;如12sp、14sp,12sp以下字体太小;

sp与dp的区别:

1、dp只跟屏幕的像素密度有关;
2、sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是正常时 1sp =
1dp = 0.00625 inch,而当文字尺寸是大或者超大时,1sp > 1dp = 0.00625
inch。类似在Windows里调整字体尺寸以后的效果–窗口大小不变,只有文字大小改变;

  屏幕适配问题的本质是使得布局、布局组件、图片资源和用户界面流程等在Android不同尺寸、不同分辨率的手机上具备相同的显示效果;
1、关于布局组件的适配:

1、使用密度无关像素指定尺寸,即dp;
2、使用相对布局或线性布局,不要使用绝对布局;
3、使用wrap_content、match_parent、权重(layout_weight);
4、使用minWidth、minHeight、lines等属性;
5、使用dimens适配;

2、关于布局的适配:
  通过伸缩控件来适应各种不同屏幕大小的布局,但是有些控件伸缩之后,未必能达到最好的用户体验;此时应用程序应该不仅仅实现了可自适应的布局,还应该提供一些方案根据屏幕的配置来加载不同的布局,可以通过配置限定符(configuration qualifiers)来实现;配置限定符允许程序在运行时根据当前设备的配置自动加载合适的资源(如为不同尺寸屏幕设置不同的布局);

1、使用Size限定符,如(large等);
2、使用最小宽度(smallest-width)限定符,通过指定某个最小宽度(以dp为单位)来精确定位屏幕从而加载不同的UI资源;
3、使用布局别名;
4、使用屏幕方向限定符:横屏(layout-land)和竖屏(layout-port);
5、多套layout适配;

3、关于图片的适配:

1、Logo图标,建议按照官方标准做好各个图标;
2、普通图片和图标,建议按照官方的密度类型进行切图即可,但一般我们只需xhdpi或xxhdpi的切图即可满足我们的需求,我目前是放在xhdpi;
3、自动拉伸位图,九宫图即Nine-Patch的图片类型;
4、动画、自定义View、shape;
5、ImageView的ScaleType适配,一般情况下,设置为centerCrop能获得较好的适配效果,但具体还要实际开发;

4、关于代码适配: 
  代码中可以使用Google提供的API对设备的屏幕宽高进行测量,然后按照需求进行设置;
5、关于接口适配: 
  本地加载图片前,判断手机分辨率或像素密度,向服务器请求对应级别的图片,按需返回图片;

6、百分比适配方法:
下面介绍一种适配方案,即我目前使用的一种适配方法:百分比适配方法,步骤如下:

1、以某一分辨率为基准,生成所有分辨率对应像素数列表;
2、将生成的像素数列表存放在res目录下对应的values文件下;
3、根据UI设计师给出设计图上的尺寸,找到对应像素数的单位,然后设置给控件即可;

注:这里推荐一个工具来帮我们完成不同分辨率对应像素数列表,这个工具是张鸿洋大佬提供的,下载链接

注:工具默认基准为400x320;下面看一下怎么使用该工具:

第一步: 
  打开终端,切到autolayout.jar所在的文件目录,如:设置基准为320x400,额外支持尺寸有:1080x1920、1440x2560,命令如下:

java -jar autolayout.jar 320 400 1080,1920_1440,2560

第二步: 
  在autolayout.jar所在的目录下会生成一个res文件,里面包含一系列不同分辨率对应像素数列表,把生成的各像素数列放到对应的资源文件values目录下(注意宽高要对应);
这里写图片描述
将上面res文件夹下的文件,放到工程项目的对应res下;
这里写图片描述
注意: 

必须在默认values文件夹里面也创建对应默认lay_x.xml和lay_y.xml文件(注意对应单位改为dp,而不是上面那些px);因为对于没有生成对应分辨率文件的手机,会使用默认的values文件夹,如果默认values文件夹没有就会报错,从而无法进行屏幕适配;而由于没有对应的分辨率文件,在不知道机型分辨率的情况下,默认分辨率文件夹只好默认为:x1 = 1dp以保证尽量兼容,这也是这个解决方案的一个弊端;

第三步: 
  根据UI给出的某一分辨率设计图上的尺寸,找到对应像素数的单位,然后设置到对应的控件即可;

这种百分比适配方案也有小缺点,但是基本可以满足90%的机型适配,缺点如下:

1、由于实际上还是使用px作为长度的度量单位,所以和google的要求使用dp作为度量单位会有所背离;
2、必须尽可能多的包含所有分辨率对应像素数列表,因为这个是使用这个方案的基础,如果有某个分辨率缺少,将无法完成该屏幕的适配;
3、过多的分辨率像素数描述xml文件会增加软件包的大小和维护的难度;

今天学习了Android开发屏幕适配方案,做个总结笔记,方便以后查看!
参考:
Android开发:最全面、最易懂的Android屏幕适配解决方案

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

Android开发屏幕适配方案 的相关文章

  • 新的 Material Design 底部导航应使用哪个视图? [复制]

    这个问题在这里已经有答案了 我相信你们都听说过添加底部导航 https www google com design spec components bottom navigation html材料设计指南 我计划将其添加到我的应用程序中 但
  • Android Paint:如何获得“喷枪”效果?

    我正在关注 API 演示中的 FingerPaint 演示 我需要获得 喷枪 效果 从某种意义上说 当我在同一个点上绘制时 它会变得越来越暗 请看图片 正如你所看到的 中心更暗 因为我不止一次在同一个地方涂上油漆 请问 如果绘制多次 如何获
  • chrome 检查器,远程调试在我的移动应用程序上不再正常工作

    我使用 Cordova Ionic 构建了一个渐进式 Web 应用程序 三年来的大部分时间里 我一直在使用开发工具来排除故障并分析我的应用程序的内部工作原理 然而 在过去的几周里 我认为自从 Chrome 更新到 v70 以来 开发工具无法
  • 移动网站 Facebook 使用 Facebook App 登录以获取登录详细信息

    使用网络浏览器 例如Android 上的 Chrome 如果移动网站要求用户登录 Facebook 而用户没有登录 则即使手机可能通过 Facebook 本机应用程序登录 Facebook 浏览器也会要求用户提供登录详细信息 有没有什么方法
  • android中.so文件的实际用途是什么? [复制]

    这个问题在这里已经有答案了 我想在我的应用程序中实现类似聊天的环聊 我一直在使用 opentok 库 我在其中看到了 libopentok so 文件 谁能告诉我 libopentok so 文件的确切用法是什么 在Android中 我们可
  • 错误:java.lang.NoClassDefFoundError Android

    我正在关注这个创建滑动选项卡的教程 http www truiton com 2015 06 android tabs example fragments viewpager 但我收到上述错误 我的 gradle 依赖结构 dependen
  • 如何知道哪个用户正在尝试登录?

    用户是使用电子邮件和密码创建的 这就是我进行注册的方式 mSignup setOnClickListener new View OnClickListener Override public void onClick View v mEma
  • 从当前位置出发的移动网络行车路线

    我正在构建一个网站的移动版本 试图通过一键式链接来启动 Google 地图 并提供从用户当前位置到企业的行车路线 我让它在 iPhone 上运行良好 但在 Android 上测试时 它会查看 Current 20Location 并尝试查找
  • 加载内容时在 ImageView 中使用“动画圆圈”

    我目前在我的应用程序中使用一个列表视图 可能需要一秒钟才能显示 我目前所做的是使用列表视图的 id android empty 属性来创建 正在加载 文本
  • 在路径上找不到类:DexPathList?

    当我在 android studio 中使用 USB 在真实设备中测试时 我的应用程序工作正常 但是当我将 apk 发送到另一台设备并在那里安装时 它无法工作 应用程序崩溃了 我没有找到任何正确的方法来解决问题 错误如下 FATAL EXC
  • Gradle 构建无法解析生成的类

    我刚刚将 Android Studio 从 1 5 更新到 2 2 1 Gradle 也是如此 我有一个项目 它使用注释处理器框架 由我制作 来执行类似 Dagger 的依赖注入 这在更新之前工作得很好 但现在 Gradle 无法解析生成的
  • 出现软键盘时布局未向上推

    I have designed layout by taking the reference from this https stackoverflow com questions 16411056 how to adjust layout
  • Android 对 Runtime.getRuntime().exec() 的权限

    我有一个应用程序在清单上具有以下权限 我的应用程序在 Android JB 4 1 2 上运行 UPDATE 我尝试在 JB 上运行该应用程序 但它不起作用 它适用于早期的 API 版本
  • 如何在Android 11中获取dir文件列表

    我想编写自己的精简版文件浏览器 文件 API 现在不适用于外部存储 该版本还提供了对范围存储的改进 这使得开发人员可以更轻松地迁移到使用此存储模型 我不明白如何使用范围存储来访问 sdcard 如果您正在寻找文件选择器体验 存储访问框架 h
  • 使用 LinearLayout 将按钮放在屏幕底部?

    我有以下代码 如何使 3 个按钮位于底部
  • android 填充包含片段的布局

    问题是什么 我如何膨胀包含片段的布局 我不知道错误消息的含义 请帮我 谢谢 错误信息 09 01 18 44 58 698 E AndroidRuntime 20617 Caused by java lang IllegalArgument
  • Android Webview:无法调用确定的可见性() - 从未见过 pid 的连接

    我有一个 Android Webview 当我单击链接下载文件 pdf 图像等 时 我收到一条错误消息 Error message Cannot call determinedVisibility never saw a connectio
  • Volley 在第一次调用方法时返回 null

    我正在尝试使用 volley 从服务器检索数据 但是当我第一次调用此方法时 我收到服务器的响应 但该方法返回 null 如果我第二次调用它 我会得到最后的响应 public String retrieveDataFromServer Str
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • Android:防止嗅探(例如使用 CharlesProxy)SSL 流量

    我使用 Charles 检查将我的应用程序发送到 HTTPS 的数据 我在手机上安装了 Charles CA 证书 因此我能够解密每个 SSL 流量 但我发现一些应用程序无法看到 SSL 流量 我如何将这种行为实现到我自己的应用程序中 有了

随机推荐

  • ImageRewrad

    ImageReward Learning and Evaluating Human Preferences for Text to Image Generation https arxiv org pdf 2304 05977 pdf ht
  • 雪花算法实现

    文章目录 原理 引入依赖 SnowflakeManager 生成ID SnowflakeProperties 配置 注册SnowflakeManager snowflake的yaml 测试 原理 分别有三部分 其中第一位保留位 暂时没用 第
  • C++全局变量被多次析构导致程序崩溃的问题

    问题描述 1 在静态库libxxx a中定义了一个全局的string对象 2 有多个so文件都连接了这个静态库 并且引用了这个全局变量 3 有一个程序同时加载了多个上述的so文件 4 在这个程序退出时 全局的string就会被多次析构 5
  • vue正式环境与测试环境压包配置方法

    1 安装cross env cnpm install save dev cross env package json配置修改 这里分别添加env config prod env config dev来控制当前的压包环境 package js
  • 互联网网站的反爬虫策略浅析

    因为搜索引擎的流行 网络爬虫已经成了很普及网络技术 除了专门做搜索的Google Yahoo 微软 百度以外 几乎每个大型门户网站都有自己的搜索引擎 大大小小叫得出来名字得就几十种 还有各种不知名的几千几万种 对于一个内容型驱动的网站来说
  • org.springframework.context.annotation.ConflictingBeanDefinitionException异常处理

    问题描述 项目启动时 报了这个错 org springframework context annotation ConflictingBeanDefinitionException 标记为Bean类 com gaotai zhxy prop
  • 在vmware环境下安装ubuntu

    在vmware环境下安装ubuntu18 04 1 下载VMware workstation16 2 下载ubuntu 18 04 5 3 安装vmware 创建虚拟机 一 VMware workstation16 下载链接 https p
  • 10、CLASSIFIER-FREE DIFFUSION GUIDANCE

    简介 论文 https arxiv org pdf 2207 12598 pdf 分类器指导将扩散模型的得分估计与图像分类器的梯度相结合 因此需要训练与扩散模型分开的图像分类器 实验证明 在没有分类器的情况下 指导确实可以由纯生成模型执行
  • sed全文字符串替换

    sed i s 被替换的内容 要替换成的内容 file sudo sed i s archive ubuntu mirrors aliyun etc apt sources list
  • 抖音rpc调用生成x-gorgon、x-argus签名学习记录

    一 通过jadx gui分析apk 找到签名入口函数如下 先hook下这个函数 能看到有结果 接下来就是构造参数模拟调用就行 有两个参数 第一个是url的拼接 第二个是headers里面的一些参数构成的map 这个参数每个接口可能不一样 我
  • 若依ruoyi改皮肤-主题(二)

    一 风格等基础设置 有深色和浅色风格两种 根据设计图考虑是否需要 如果不需要 去掉一种风格 这里以浅色风格为主 在 布局设置 里 可以设置主题风格 深浅 主题颜色 直接下拉修改主色 隐藏菜单 顶部标签等等 如果想在css里修改 1 主题风格
  • 30套JSP网站源代码合集

    JSP技术是以Java语言作为脚本语言的 JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序 我收集了一些JSP开发的网站源代码 从实践中学习 希望对大家有用 资料名称 下载地址 网上购物系统 jsp mysq
  • 原根

    定义 在数论 特别是整除理论中 原根是一个很重要的概念 对于两个正整数 由欧拉定理可知 存在正整数 比如说欧拉函数 即小于等于的正整数中与互素的正整数的个数 使得 由此 在时 定义对模的指数 为使 成立的最小的正整数 由前知 一定小于等于
  • nodejs接收form-data数据

    nodejs接收form data类型的数据 不能使用body parser来解析接收 multiparty有多个监听方法 这只是其中一种 var multiparty require multiparty var fs require f
  • 软件压力测试和性能测试分析方法论

    压测和性能分析方法论 性能测试基础 性能测试的常见分类 性能测试 用来验证系统的性能是否满足设计的预期 一般来说对系统的压力会比较小 不会压垮系统 只是进行简单的验证 负载测试 通过不断施加负载压力 寻找系统最优的处理能力 最好的性能状态
  • 北京题库插件:没法登陆又何妨?

    背景介绍 什么是北京题库 北京题库 是专注于中小学教学产品研发的教研平台 拥有试卷 资料等优质资源 致力于为教师备课 教研提供一站式服务 百度百科 简单来说 收录的很多资料 相对好用一点 但是 其使用是有一定限制的 比如网页端必须要微信扫码
  • void与void*

    void与void void关键字的使用规则 1 如果函数没有返回值 那么应声明为void类型 2 如果函数无参数 那么应声明其参数为void 3 如果函数的参数可以是任意类型指针 那么应声明其参数为void 4 void不能代表一个真实的
  • SISD、MIMD、SIMD、MISD计算机的体系结构的Flynn分类法

    1 计算平台介绍 Flynn于1972年提出了计算平台的Flynn分类法 主要根据指令流和数据流来分类 共分为四种类型的计算平台 如下图所示 单指令流单数据流机器 SISD SISD机器是一种传统的串行计算机 它的硬件不支持任何形式的并行计
  • Elasticsearch 开启https鉴权

    Elasticsearch 早期的版本配置鉴权 由于插件收费 所以配置起来比较麻烦 但是最近发现Elasticsearch的8 2版本中可以配置https及鉴权的操作 所以记录一下给想要获取该知识的人 分享一下 第一步 修改elastics
  • Android开发屏幕适配方案

    由于Android系统的开放性 任何用户 开发者 硬件厂商和运营商都可以对Android系统和硬件进行定制 修改成他们自己所需要的样子 使得随着Android设备的增多 设备碎片化 系统碎片化 屏幕尺寸碎片化和屏幕碎片化的程度也在不断加深