关于android中的各种尺寸与计算
--张学友《心如刀割》很好听

先说几个术语:
Screen size(屏幕尺寸):
指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸
摩托罗拉milestone手机是3.7英寸
Aspect Ratio(宽高比率):
指的是实际的物理尺寸宽高比率,分为long和nolong
Milestone是16:9,属于long
Resolution(分辨率)
和电脑的分辨率概念一样,指手机屏幕纵、横方向像素个数
Milestone是854*480
DPI(dot per inch) - <图像每英寸长度内的像素点数>
每英寸像素数,如120dpi,160dpi等,假设QVGA(320*240)分辨率的屏幕物理尺寸是(2英寸*1.5英寸),dpi=160
可以反映屏幕的清晰度,用于缩放UI的
Density(密度)
屏幕里像素值浓度,resolution/Screen size可以反映出手机密度,
Density-independent pixel (dip)
指的是逻辑密度计算单位,dip和具体像素值的对应公式是dip/pixel=dpi值/160,也就是px = dp * (dpi / 160)
手机像素密度(density)实际上是以单位英寸160个像素作为参考标准,主要密度有0.75,1,1.5和2,当密度为2时就表示1英寸有320个像素,Android中通过代码可以获取到屏幕的像素值和密度,根据这些值就可以反向算出屏幕的物理尺寸
屏幕尺寸=屏幕对角线的像素值/(密度*160)= [(长的平方+宽的平方)开根号] / (密度*160)
实践过程:
由于Android设备中获取的密度density本身是个约等于的数值,比如计算出密度的准确值density=1.575,实际在代码中读到的density=1.5, 需要实现一个简单的计算屏幕尺寸的应用在不同设备上验证物理尺寸准确程度,具体代码如下:
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
double diagonalPixels = Math.sqrt(Math.pow(width, 2)+Math.pow(height, 2)) ;
double screenSize = diagonalPixels/(160*density) ;
有可能上面的计算屏幕的尺寸不是太准确
这段描述和代码解释了通过 Android 提供的 DisplayMetrics 类获取设备屏幕尺寸的方法,并讨论了其中的准确性问题。总体来说,这段描述和代码是正确的,但有一些关键点需要更详细的分析。
1. 关于屏幕密度 (density)
-
density:确实如描述所说,density是一个相对值,表示基于标准 160 dpi 的比例因子。例如,density=2表示设备的像素密度是标准 160 dpi 的 2 倍,即 320 dpi。 -
densityDpi:是屏幕的实际像素密度,表示每英寸的像素数。例如,densityDpi=240表示屏幕的像素密度为 240 dpi。
2. 计算屏幕尺寸的公式
公式:
屏幕尺寸=宽度2+高度2density×160\text{屏幕尺寸} = \frac{\sqrt{\text{宽度}^2 + \text{高度}^2}}{\text{density} \times 160}屏幕尺寸=density×160宽度2+高度2
这个公式从屏幕的对角线像素数出发,将其除以 density * 160 以得到屏幕的物理尺寸(通常以英寸为单位)。这个公式背后的逻辑是:
-
density * 160表示屏幕的像素密度(即每英寸有多少个像素),其中160是标准密度 DPI 的基准。 -
宽度2+高度2\sqrt{\text{宽度}^2 + \text{高度}^2}宽度2+高度2 计算的是屏幕对角线的像素数。
3. 代码的实际准确性问题
如描述中所提到的,实际测量的 density 是一个近似值,而不是一个精确值。对于一些设备,实际的 density 可能会在代码中显示为 1.5,而实际值可能更接近 1.575。这种误差可能导致计算出的屏幕物理尺寸略有偏差。
误差来源:
- 近似值误差:
density是一个近似值,可能会导致计算误差。虽然误差通常较小,但在某些设备上可能会显著影响屏幕尺寸的精确性。 - 屏幕密度的取整:Android 设备通常将
density四舍五入到最接近的常用值(如 0.75、1.0、1.5、2.0),这使得计算出的物理尺寸有时不够精确。
4. 改进建议
为了提高准确性,可以考虑以下方法:
-
使用
xdpi和ydpi:而不是使用近似的density值,你可以使用xdpi和ydpi来计算屏幕的物理尺寸。xdpi和ydpi是分别表示水平方向和垂直方向的实际像素密度,它们通常比density更精确。改进后的公式:
屏幕尺寸=宽度2+高度2sqrt(xdpi2+ydpi2)\text{屏幕尺寸} = \frac{\sqrt{\text{宽度}^2 + \text{高度}^2}}{\text{sqrt}(\text{xdpi}^2 + \text{ydpi}^2)}屏幕尺寸=sqrt(xdpi2+ydpi2)宽度2+高度2
5. 总结
- 你描述的方法和代码是有效的,并且在大多数情况下可以近似计算屏幕尺寸。
- 由于
density可能是一个近似值,这种计算方法可能存在一定误差。如果需要更准确的结果,建议使用xdpi和ydpi,它们能够提供更精确的像素密度值,从而提高计算的准确性。
为了提高屏幕物理尺寸计算的准确性,我们可以使用屏幕的实际像素密度(xdpi 和 ydpi)来代替 density。这样可以减少由于近似值导致的误差,从而更加准确地计算出设备的屏幕尺寸。下面是改进后的代码以及详细解释。
改进后的计算方法
所需参数:
- 屏幕分辨率:屏幕的宽度像素数(
widthPixels)和高度像素数(heightPixels)。 - 实际像素密度:水平方向和垂直方向的像素密度,分别是
xdpi和ydpi。
计算公式:
-
计算屏幕宽度和高度的英寸值:

2.通过勾股定理计算屏幕的对角线长度(即物理尺寸):

改进后的代码示例
import android.content.Context;
import android.util.DisplayMetrics;public class ScreenSizeUtil {public static double getScreenSizeInInches(Context context) {// 获取DisplayMetrics实例DisplayMetrics dm = context.getResources().getDisplayMetrics();// 获取屏幕的宽度和高度(以像素为单位)int widthPixels = dm.widthPixels;int heightPixels = dm.heightPixels;// 获取水平方向和垂直方向的像素密度(以每英寸像素数为单位)float xdpi = dm.xdpi;float ydpi = dm.ydpi;// 计算屏幕宽度和高度的英寸值double widthInInches = widthPixels / xdpi;double heightInInches = heightPixels / ydpi;// 使用勾股定理计算屏幕的物理尺寸(对角线长度)return Math.sqrt(Math.pow(widthInInches, 2) + Math.pow(heightInInches, 2));}
}
解释
-
获取屏幕分辨率:
widthPixels和heightPixels是屏幕的实际分辨率,表示屏幕的宽度和高度的像素数。
-
获取实际像素密度:
xdpi和ydpi表示水平方向和垂直方向的像素密度,分别表示每英寸的像素数。
-
计算屏幕宽度和高度的英寸值:
- 宽度和高度的英寸值是通过将像素数除以对应方向的像素密度得到的。
-
计算屏幕的物理尺寸:
- 通过勾股定理计算屏幕的对角线长度,得到实际的屏幕尺寸(通常以英寸为单位)。
改进后的优点
- 准确性更高:使用
xdpi和ydpi而不是近似的density值,减少了由于density的四舍五入或近似值引起的误差。 - 适应性更强:这段代码可以在各种 Android 设备上更加准确地计算屏幕尺寸,适用于需要精确测量屏幕尺寸的场景。
通过这种方式,计算出的屏幕物理尺寸更加接近设备的实际尺寸,适用于需要精确显示效果的应用场景。
相关文章:
关于android中的各种尺寸与计算
--张学友《心如刀割》很好听 先说几个术语: Screen size(屏幕尺寸): 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 摩托罗拉milestone手机是3.7英寸 Aspect Ratio(宽高比率)&am…...
MySQL避免索引失效的方法详细介绍
避免索引失效 在MySQL中,索引是帮助MySQL高效获取数据的数据结构。它就像一本书的目录,通过索引可以快速定位到数据的具体位置,从而减少对数据库的扫描量,提高查询速度。索引可以存储在表中的一个或多个列上,创建索引…...
【Java】深入了解 Java 的 charAt() 方法
我最爱的那首歌最爱的angel 我到什么时候才能遇见我的angel 我最爱的那首歌最爱的angel 我不是王子也会拥有我的angel 🎵 张杰《云中的angel》 在 Java 编程中,字符串(String)是我们经常处理的数据类型之一。…...
Linux 下 ETCD 安装、配置与命令使用总结
大家好,我是程序员小羊! 前言: Linux 下 ETCD 安装、配置与命令使用总结 ETCD 是一个分布式键值存储系统,广泛用于服务发现、分布式锁、配置管理等场景,特别是在 Kubernetes 集群中发挥着至关重要的作用。ETCD 的高…...
C++笔试练习笔记【7】:力扣 91. 解码方法 动态规划练习
文章目录 题目题目分析思路解法正常解法优化解法 题目 题目链接:力扣 91. 解码方法 备用链接:https://leetcode.cn/problems/decode-ways/description/ 题目分析 1.首先我们知道题目给定A~Z编码为1 ~26 ,而数字十一字符串的形式给出所以…...
【antd】antd3的表单校验不提示报错信息
描述 不是网上所谓的自定义校验方法的问题。 今天在写一个antd3的业务的时候,封装一个组件,把校验和请求事件放在一个方法里面,用回调或者promise进行异步处理。 发现原因是在校验错误的判断,进行callback之后,页面…...
Game AI ——游戏人工智能(逻辑及剧情生成)
一、Game AI 的介绍 "Game AI"(游戏人工智能)通常指的是在电子游戏中使用的各种人工智能技术和算法,用于控制游戏中的非玩家角色(NPC)、敌人、队友等,以及为玩家提供有挑战性的对手或有趣的互动…...
算法基础知识——核函数
简介:个人学习分享,如有错误,欢迎批评指正 核函数(Kernel Function)是机器学习中一种重要的工具,特别是在支持向量机(SVM)、核岭回归、核主成分分析(KPCA)等核…...
安卓xml乱码/加密转换:abx2xml和xml2abx使用及源码介绍
背景: 上一篇文章 android系统中data下的xml乱码无法查看问题剖析及解决方法 发布后,想要寻找一个可以直接把二进制xml和普通xml进行相互转换的,当时还写了相关的方案,但是当时没有找到现成的开源工具,后来经过相关粉…...
slice 截取
JavaScript中的一个数组方法。然而,在Vue 3的应用开发中,slice 方法经常被用于处理数组数据,特别是在需要实现分页、数据截取或数据展示等场景时。 slice 方法的基本用法 slice() 方法返回一个新的数组对象,这一对象是一个由 be…...
XReparentWindow踩坑分析
X11是Linux发行系统中广泛采用的显示协议,各个系统基本上都支持XLib库,作为底层接口,XReparentWindow接口的功能就是重新设置父窗口,注意这个可以跨进程设置父窗口,例如将已经运行的进程的父窗口设置自己的程序Wid&…...
OpenAI动荡,将走向何方、GPT5或许将近、毒舌AI轻松破防网友、最新版 GPT-4o AI 模型得满分 | AGI视界周刊第 4 期
AI 视界周刊由战场小包维护,每周一更新,包含热点聚焦、应用破局、学术前沿、社区热议、智见交锋、跨界 AI、企业动态和争议 AI 八大板块,后续板块划分和内容撰写在周刊迭代过程中持续优化,欢迎大家提出建议。 欢迎大家来到《AI 视…...
RCE---无字母数字webshell
<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); } 分析代码:传参不大于35&…...
有意思的漏洞复现与分析一
目录 一、Linux命令长度限制突破方法 1.在二进制漏洞利用中,某师傅遇到可控数据只有8字节的情况,去掉字符 串尾的\0,限制在7个字符。 一、Linux命令长度限制突破方法 1.在二进制漏洞利用中,某师傅遇到可控数据只有8字节的情况&a…...
力扣题解(按身高排序)
2418. 按身高排序 给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i,names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 思路&…...
Redis的六种淘汰策略详解
Redis作为一种高性能的键值对存储系统,其数据全部存储在内存中,因此内存管理对Redis的性能至关重要。当Redis的内存使用达到上限时,就需要通过淘汰策略来释放内存空间,以便存储新的数据。Redis提供了六种不同的淘汰策略࿰…...
vue3中 ref 和 reactive 的区别
相同:均是声明响应式对象。且声明的响应式对象是深层的 1. 数据类型不同:ref用于包装JavaScript基本类型的数据(如字符串、数字、布尔值等),而reactive可以用于包装JavaScript对象和数组等复杂类型的数据。 2.访问方式…...
《单例模式的深度解读:实现方式、破坏情况与利弊权衡》
单例模式 一、单例模式的定义 单例模式(Singleton Pattern)是一种常见的软件设计模式,确保一个类只有一个实例存在,并提供一个全局访问点来获取该实例。 二、单例模式的实现方式 1.懒汉式单例 public class LazySingle…...
010607电压源和电流源受控源
电源的理论部分 1.6电压源和电流源1.理想电压源: 1.6电压源和电流源 1.理想电压源: 其两端电压总能保持定值或一定的时间函数,其值与流过它的电流i无关的元件叫理想电压源。 电路符号:中间与导线直通的圆圈 电压源:…...
快乐数求解
编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1,…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
