Android 屏幕适配
目录
一、为什么要适配
二、几个重要的概念
2.1 屏幕尺寸
2.2 屏幕分辨率
2.3 屏幕像素密度
2.4 屏幕尺寸、分辨率、像素密度三者关系
三、常用单位
3.1 密度无关像素(dp)
3.2 独立比例像素(sp)
3.3 dp与px的转换
四、解决方案
4.1 今日头条
4.2 ScreenMatch适配
4.2.1 下载插件
4.2.2 使用
4.2.3 「自定义values文件」
4.3 选择适配方案->今日头条
官方文档-屏幕兼容性概览
一、为什么要适配
由于Android系统的开放性,OEM厂商、运营商都可以对Android进行定制,于是导致运行 Android 的设备多种多样,它们有着不同的屏幕尺寸和像素密度。
尽管系统可通过基本的缩放和调整大小功能使界面适应不同屏幕,但你应做出进一步优化,以确保界面能够在各类屏幕上美观地呈现。
例如UI以375px宽度来设计,如果你直接使用1dp=1px的这种方式来写代码,那么在不同屏幕的手机上面的显示可能是不一样的,这就需要你来做适配。
二、几个重要的概念

2.1 屏幕尺寸

屏幕尺寸指屏幕的对角线的长度,单位是英寸(inch),1英寸=2.54厘米
比如常见的屏幕尺寸有:4.7寸、5寸、5.5寸、6寸等。
还有一些特殊屏幕尺寸,例如Redmi K40:6.67英寸。
这个一般在设置关于手机中查看自己的屏幕尺寸。
2.2 屏幕分辨率
屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点。一般以「纵向像素x横向像素,如1080x2400」。表示宽度方向上有1080个像素点,在高度方向上有2400个像素点
单位:px(pixel),1px=1像素点。Android手机常见的分辨率:480x800、720x1280、1080x1920
UI设计师的设计图会以px作为统一的计量单位
2.3 屏幕像素密度
屏幕像素密度是指每英寸上的像素点数,单位是dpi,即"dot per inch"的缩写。
屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。
假设设备内每英寸有160个像素,那么该设备的屏幕像素密度=160dpi
安卓手机对于每类手机屏幕大小都有一个相应的屏幕像素密度:
| 密度类型 | 代表的分辨率(px) | 屏幕像素密度(dpi) |
|---|---|---|
| 低密度(ldpi) | 240x320 | 120 |
| 中密度(mdpi) | 320x480 | 160 |
| 高密度(hdpi) | 480x800 | 240 |
| 超高密度(xhdpi) | 720x1280 | 320 |
| 超超高密度(xxhdpi) | 1080x1920 | 480 |
2.4 屏幕尺寸、分辨率、像素密度三者关系

像素密度(dpi) =宽高/屏幕大小。
例如:屏幕分辨率为1080x2400,屏幕尺寸为6.67来计算。
1. 像素密度(dpi) = / 6.67
2. 像素密度(dpi) = 6926400 / 6.67
3. 394.573532825 = 6926400 / 6.67
「即:每寸越有395个像素」
三、常用单位
3.1 密度无关像素(dp)
density-independent pixel,叫dp或dip,与终端上的实际物理像素点无关。可以保证在不同屏幕像素密度的设备上显示相同的效果
Android开发时用dp而不是px单位设置图片大小,是Android特有的单位场景:假如同样都是画一条长度是屏幕一半的线,如果使用px作为计量单位,那么在480x800分辨率手机上设置应为240px;在320x480的手机上应设置为160px,二者设置就不同了;如果使用dp为单位,在这两种分辨率下,160dp都显示为屏幕一半的长度。
3.2 独立比例像素(sp)
sp,即scale-independent pixels,与dp类似,但是可以根据文字大小首选项进行放缩,是设置字体大小的御用单位。
3.3 dp与px的转换
在Android中,规定以160dpi(即屏幕分辨率为320x480)为基准:1dp=1px。
px = dp * (dpi / 160)
| 密度类型 | 代表的分辨率(px) | 屏幕密度(dpi) | 换算(px/dp) | 比例 |
|---|---|---|---|---|
| 低密度(ldpi) | 240x320 | 120 | 1dp=0.75px | 3 |
| 中密度(mdpi) | 320x480 | 160 | 1dp=1px | 4 |
| 高密度(hdpi) | 480x800 | 240 | 1dp=1.5px | 6 |
| 超高密度(xhdpi) | 720x1280 | 320 | 1dp=2px | 8 |
| 超超高密度(xxhdpi) | 1080x1920 | 480 | 1dp=3px | 12 |
四、解决方案
4.1 今日头条
px值 = dp值 * metrics.density,这里的density是指的手机的屏幕密度,由系统提供,不同的手机的density可能不同;所以我们不能直接使用系统的density,需要篡改density来达到适配的目的
public class MainActivity extends AppCompatActivity {private static float sNoncompatDensity;// 系统的Densityprivate static float sNoncompatScaleDensity;// 系统的ScaledDensityprivate static void setCustomDensity(Activity activity, final Application application){final DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();if(sNoncompatDensity == 0){// 系统的DensitysNoncompatDensity = appDisplayMetrics.density;// 系统的ScaledDensitysNoncompatScaleDensity = appDisplayMetrics.scaledDensity;// 监听在系统设置中切换字体application.registerComponentCallbacks(new ComponentCallbacks() {@Overridepublic void onConfigurationChanged(@NonNull Configuration newConfig) {if(newConfig != null && newConfig.fontScale > 0){sNoncompatScaleDensity = application.getResources().getDisplayMetrics().scaledDensity;}}@Overridepublic void onLowMemory() {}});}// 此处以360dp的设计图作为例子final float targetDensity = appDisplayMetrics.widthPixels / 360;final float targetScaledDensity = targetDensity * (sNoncompatScaleDensity/sNoncompatDensity);final int targetDensityDpi = (int)(160 * targetDensity);appDisplayMetrics.density = targetDensity;appDisplayMetrics.scaledDensity = targetScaledDensity;appDisplayMetrics.densityDpi = targetDensityDpi;final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();activityDisplayMetrics.density = targetDensity;activityDisplayMetrics.scaledDensity = targetScaledDensity;activityDisplayMetrics.densityDpi = targetDensityDpi;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setCustomDensity(this,this.getApplication());setContentView(R.layout.activity_main);}
}
4.2 ScreenMatch适配
Android ScreenMatch屏幕适配是一种简单适用的适配方式,是由Android官方推出的适配方法
4.2.1 下载插件

4.2.2 使用

之后会有选择项目的界面,选择你想在哪个项目中使用ScreenMatch。
根据你选择的尺寸来生成对应的values,默认有一大堆。

4.2.3 自定义values文件

在screenMatch.properties中你需要关注:
-
1.base_dp:若base_dp=360这种机型在你项目中就不可能有,你完全可以根据你项目中的基础机型来配置这个基础base_dp。我这是UI用的375,所以此处改为375。
-
2.match_dp和ignore_dp要配合使用:
-
match_dp:需要的尺寸
-
ignore_dp:忽略的尺寸
-
所有尺寸在红框上方的注解里面有。

4.3 选择适配方案->今日头条
-
1.快捷方便
-
2.后期维护调整也省事
-
3.包体小
官方文档-屏幕兼容性概览
相关文章:
Android 屏幕适配
目录 一、为什么要适配 二、几个重要的概念 2.1 屏幕尺寸 2.2 屏幕分辨率 2.3 屏幕像素密度 2.4 屏幕尺寸、分辨率、像素密度三者关系 三、常用单位 3.1 密度无关像素(dp) 3.2 独立比例像素(sp) 3.3 dp与px的转换 四、解决方案 4.1 今日头条…...
Python使用Mechanize库完成自动化爬虫程序
目录 引言 一、了解Mechanize库 二、安装Mechanize库 三、使用Mechanize库发送HTTP请求 四、使用Mechanize库解析HTML页面 五、使用Mechanize库模拟用户输入 六、使用Mechanize库处理JavaScript动态生成的内容 七、使用Mechanize库处理登录和表单提交的常见问题 总结 …...
【Shell脚本入门】
Shell中的特殊符号 1.$ 美元符号,用来表示变量的值。 如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值。2.# 井号,除了做为超级用户的提示符之外,还可以在脚本中做为注释的开头字母,每一行语句中ÿ…...
redis大全
redis-cli 常用命令 redis常用命令 redis数据结构 redis数据结构 redis持久化存储 持久化存储 redis事务 redis事务 redis管道 管道 redis7集群搭建 集群 redis常见问题以及解决方案 常见问题以及解决方案 redis面试题 面试题 redis高级案列case 高级case sp…...
linux rsyslog日志采集格式设定五
linux rsyslog日志采集格式设定五 1.创建日志接收模板 打开/etc/rsyslog.conf文件,在GLOBAL DIRECTIVES模块下任意位置添加以下内容 命令: vim /etc/rsyslog.conf 测试:rsyslog.conf文件结尾添加以下内容 $template ztj,"%fromhost-ip% %app-name% %syslogseveri…...
uni-app:如何配置uni.request请求的超时响应时间(全局+局部)
方法一:全局配置响应时间 一、进入项目的manifest.json的代码视图模块 二、写入代码 "networkTimeout": {"request": 5000 }, 表示现在request请求响应时间最多位5秒 方法二:局部设置响应时间 一、直接在uni.request中写入属性…...
AI中文版怎么用,版本分享,GPT官网入口
网页版上线啦,在线助力大学生、上班族的高效生活! GPT4.0是OpenAI最新推出的聊天模型,它的语言理解和生成能力比以前的版本更强大。对于忙碌的上班族来说,GPT4.0能帮助你高效处理工作中的大部分写作任务,比如撰写报告…...
mysql数据库通过binlog恢复数据
1:通过命令查询是否开启 show variables like log_bin2:查看binlog文件存放目录 show variables like %datadir%3:通过positon恢复 mysqlbinlog --start-position219 --stop-position636 --databasetest "/data/binlog.00001" …...
【unity插件】UGUI的粒子效果(UI粒子)—— Particle Effect For UGUI (UI Particle)
文章目录 前言插件地址描述特征Demo 演示如何玩演示对于 Unity 2019.1 或更高版本对于 Unity 2018.4 或更早版本 用法基本上是用法使用您现有的 ParticleSystem 预制件带 Mask 或 RectMask2D 组件脚本用法UIParticleAttractor 组件开发说明常见问题解答:为什么我的粒…...
高教社杯数模竞赛特辑论文篇-2023年C题:基于历史数据的蔬菜类商品定价与补货决策模型(附获奖论文及R语言和Python代码实现)(中)
目录 六、 问题三模型建立与求解 6.1 问题三求解思路 6.2 问题三模型建立 6.2.1 模型假定和预处理...
element-ui plus 文件上传组件,设置单选,并支持替换和回显
遇到的坑: 1、设置limit属性为1后,on-change属性不生效 2、on-exceed属性虽然值改变,但是回显没有随之变化 3、由于element-ui plus版本file-list值出现问题 最后的解决方案决定不设置 limit 属性,通过 on-change 中的判断来控制数…...
ZYNQ7000---FLASH读写
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Flash是什么?二、Flash的分类1、内部结构(接口)区分:2、外部接口区分:SPIQPSI Flash: QSPI 控制…...
SpringMVC log4j1升级log4j2
整个升级过程耗时5个小时,中间耗时最长的是找合适的包和升级后日志无法打印以及无法控制日志输出位置,完成后感觉其实很简单,如果一开始就能看到我现在写的笔记,可能几分钟就搞定了。 第一步:首先上log4j2所需要的包 …...
MATLAB算法实战应用案例精讲-【图像处理】机器视觉(基础篇)(十一)
目录 几个相关概念 1、焦点(focus) 2、弥散圆(circle of confusion) 3、景深(depth of field) 知识储备 线阵相机...
UE的PlayerController方法Convert Mouse Location To World Space
先上图: Convert Mouse Location To World这是PlayerController对象中很重要的方法。 需要说明的是两个输出值。 第一个是World Location,这是个基于世界空间的位置值,一开始我以为这个值和当前摄像机的位置是重叠的,但是打印出来…...
【Qt之QStandardItemModel】使用,tableview、listview、treeview设置模型
1. 引入 QStandardItemModel类提供了一个通用的模型,用于存储自定义数据。 以下是其用法:该类属于gui模块,因此在.pro中,需添加QT gui,如果已存在,则无需重复添加。 首先,引入头文件ÿ…...
mongodb 6/7的 windows安装问题
https://cloud.tencent.com/developer/article/2205068...
网站建设所需要的主要资源相关介绍
人力资源: 网站开发人员:前端开发、后端开发、UI/UX设计师等。 内容创作者:负责编写网站内容,包括文章、图片和视频。 项目经理:协调团队工作,确保项目按计划进行。 数字营销:帮助推广和市场…...
互联网上门预约洗衣洗鞋店小程序;
拽牛科技干洗店洗鞋店软件,方便快捷,让你轻松洗衣。只需在线预约洗衣洗鞋服务,附近的门店立即上门取送,省心省力。轻松了解品牌线下门店,通过列表形式展示周围门店信息,自动选择最近门店为你服务。简单填写…...
OSPF开放最短路径优先(Open Shortest Path First)协议
OSPF开放最短路径优先(Open Shortest Path First)协议 为克服RIP的缺点(限制网络规模,坏消息传得慢)在1989年开发出来的原理很简单,但实现很复杂使用了Dijkstra提出的最短路径算法SPF(Shortest Path First)采用分布式的链路状态协议(link state protoco…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
