当前位置: 首页 > news >正文

关于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. 改进建议

为了提高准确性,可以考虑以下方法:

  • 使用 xdpiydpi:而不是使用近似的 density 值,你可以使用 xdpiydpi 来计算屏幕的物理尺寸。xdpiydpi 是分别表示水平方向和垂直方向的实际像素密度,它们通常比 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 可能是一个近似值,这种计算方法可能存在一定误差。如果需要更准确的结果,建议使用 xdpiydpi,它们能够提供更精确的像素密度值,从而提高计算的准确性。

 

为了提高屏幕物理尺寸计算的准确性,我们可以使用屏幕的实际像素密度(xdpiydpi)来代替 density。这样可以减少由于近似值导致的误差,从而更加准确地计算出设备的屏幕尺寸。下面是改进后的代码以及详细解释。

改进后的计算方法

所需参数:
  • 屏幕分辨率:屏幕的宽度像素数(widthPixels)和高度像素数(heightPixels)。
  • 实际像素密度:水平方向和垂直方向的像素密度,分别是 xdpiydpi
计算公式:
  1. 计算屏幕宽度和高度的英寸值:

 

 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));}
}

 

解释

  1. 获取屏幕分辨率

    • widthPixelsheightPixels 是屏幕的实际分辨率,表示屏幕的宽度和高度的像素数。
  2. 获取实际像素密度

    • xdpiydpi 表示水平方向和垂直方向的像素密度,分别表示每英寸的像素数。
  3. 计算屏幕宽度和高度的英寸值

    • 宽度和高度的英寸值是通过将像素数除以对应方向的像素密度得到的。
  4. 计算屏幕的物理尺寸

    • 通过勾股定理计算屏幕的对角线长度,得到实际的屏幕尺寸(通常以英寸为单位)。

改进后的优点

  • 准确性更高:使用 xdpiydpi 而不是近似的 density 值,减少了由于 density 的四舍五入或近似值引起的误差。
  • 适应性更强:这段代码可以在各种 Android 设备上更加准确地计算屏幕尺寸,适用于需要精确测量屏幕尺寸的场景。

通过这种方式,计算出的屏幕物理尺寸更加接近设备的实际尺寸,适用于需要精确显示效果的应用场景。

相关文章:

关于android中的各种尺寸与计算

--张学友《心如刀割》很好听 先说几个术语&#xff1a; Screen size(屏幕尺寸)&#xff1a; 指的是手机实际的物理尺寸&#xff0c;比如常用的2.8英寸&#xff0c;3.2英寸&#xff0c;3.5英寸&#xff0c;3.7英寸 摩托罗拉milestone手机是3.7英寸 Aspect Ratio(宽高比率)&am…...

MySQL避免索引失效的方法详细介绍

避免索引失效 在MySQL中&#xff0c;索引是帮助MySQL高效获取数据的数据结构。它就像一本书的目录&#xff0c;通过索引可以快速定位到数据的具体位置&#xff0c;从而减少对数据库的扫描量&#xff0c;提高查询速度。索引可以存储在表中的一个或多个列上&#xff0c;创建索引…...

【Java】深入了解 Java 的 charAt() 方法

我最爱的那首歌最爱的angel 我到什么时候才能遇见我的angel 我最爱的那首歌最爱的angel 我不是王子也会拥有我的angel &#x1f3b5; 张杰《云中的angel》 在 Java 编程中&#xff0c;字符串&#xff08;String&#xff09;是我们经常处理的数据类型之一。…...

Linux 下 ETCD 安装、配置与命令使用总结

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Linux 下 ETCD 安装、配置与命令使用总结 ETCD 是一个分布式键值存储系统&#xff0c;广泛用于服务发现、分布式锁、配置管理等场景&#xff0c;特别是在 Kubernetes 集群中发挥着至关重要的作用。ETCD 的高…...

C++笔试练习笔记【7】:力扣 91. 解码方法 动态规划练习

文章目录 题目题目分析思路解法正常解法优化解法 题目 题目链接&#xff1a;力扣 91. 解码方法 备用链接&#xff1a;https://leetcode.cn/problems/decode-ways/description/ 题目分析 1.首先我们知道题目给定A~Z编码为1 ~26 &#xff0c;而数字十一字符串的形式给出所以…...

【antd】antd3的表单校验不提示报错信息

描述 不是网上所谓的自定义校验方法的问题。 今天在写一个antd3的业务的时候&#xff0c;封装一个组件&#xff0c;把校验和请求事件放在一个方法里面&#xff0c;用回调或者promise进行异步处理。 发现原因是在校验错误的判断&#xff0c;进行callback之后&#xff0c;页面…...

Game AI ——游戏人工智能(逻辑及剧情生成)

一、Game AI 的介绍 "Game AI"&#xff08;游戏人工智能&#xff09;通常指的是在电子游戏中使用的各种人工智能技术和算法&#xff0c;用于控制游戏中的非玩家角色&#xff08;NPC&#xff09;、敌人、队友等&#xff0c;以及为玩家提供有挑战性的对手或有趣的互动…...

算法基础知识——核函数

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正 核函数&#xff08;Kernel Function&#xff09;是机器学习中一种重要的工具&#xff0c;特别是在支持向量机&#xff08;SVM&#xff09;、核岭回归、核主成分分析&#xff08;KPCA&#xff09;等核…...

安卓xml乱码/加密转换:abx2xml和xml2abx使用及源码介绍

背景&#xff1a; 上一篇文章 android系统中data下的xml乱码无法查看问题剖析及解决方法 发布后&#xff0c;想要寻找一个可以直接把二进制xml和普通xml进行相互转换的&#xff0c;当时还写了相关的方案&#xff0c;但是当时没有找到现成的开源工具&#xff0c;后来经过相关粉…...

slice 截取

JavaScript中的一个数组方法。然而&#xff0c;在Vue 3的应用开发中&#xff0c;slice 方法经常被用于处理数组数据&#xff0c;特别是在需要实现分页、数据截取或数据展示等场景时。 slice 方法的基本用法 slice() 方法返回一个新的数组对象&#xff0c;这一对象是一个由 be…...

XReparentWindow踩坑分析

X11是Linux发行系统中广泛采用的显示协议&#xff0c;各个系统基本上都支持XLib库&#xff0c;作为底层接口&#xff0c;XReparentWindow接口的功能就是重新设置父窗口&#xff0c;注意这个可以跨进程设置父窗口&#xff0c;例如将已经运行的进程的父窗口设置自己的程序Wid&…...

OpenAI动荡,将走向何方、GPT5或许将近、毒舌AI轻松破防网友、最新版 GPT-4o AI 模型得满分 | AGI视界周刊第 4 期

AI 视界周刊由战场小包维护&#xff0c;每周一更新&#xff0c;包含热点聚焦、应用破局、学术前沿、社区热议、智见交锋、跨界 AI、企业动态和争议 AI 八大板块&#xff0c;后续板块划分和内容撰写在周刊迭代过程中持续优化&#xff0c;欢迎大家提出建议。 欢迎大家来到《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__); } 分析代码&#xff1a;传参不大于35&…...

有意思的漏洞复现与分析一

目录 一、Linux命令长度限制突破方法 1.在二进制漏洞利用中&#xff0c;某师傅遇到可控数据只有8字节的情况&#xff0c;去掉字符 串尾的\0&#xff0c;限制在7个字符。 一、Linux命令长度限制突破方法 1.在二进制漏洞利用中&#xff0c;某师傅遇到可控数据只有8字节的情况&a…...

力扣题解(按身高排序)

2418. 按身高排序 给你一个字符串数组 names &#xff0c;和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i&#xff0c;names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 思路&…...

Redis的六种淘汰策略详解

Redis作为一种高性能的键值对存储系统&#xff0c;其数据全部存储在内存中&#xff0c;因此内存管理对Redis的性能至关重要。当Redis的内存使用达到上限时&#xff0c;就需要通过淘汰策略来释放内存空间&#xff0c;以便存储新的数据。Redis提供了六种不同的淘汰策略&#xff0…...

vue3中 ref 和 reactive 的区别

相同&#xff1a;均是声明响应式对象。且声明的响应式对象是深层的 1. 数据类型不同&#xff1a;ref用于包装JavaScript基本类型的数据&#xff08;如字符串、数字、布尔值等&#xff09;&#xff0c;而reactive可以用于包装JavaScript对象和数组等复杂类型的数据。 2.访问方式…...

《单例模式的深度解读:实现方式、破坏情况与利弊权衡》

单例模式 一、单例模式的定义 ​ 单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的软件设计模式&#xff0c;确保一个类只有一个实例存在&#xff0c;并提供一个全局访问点来获取该实例。 二、单例模式的实现方式 ​ 1.懒汉式单例 public class LazySingle…...

010607电压源和电流源受控源

电源的理论部分 1.6电压源和电流源1.理想电压源&#xff1a; 1.6电压源和电流源 1.理想电压源&#xff1a; 其两端电压总能保持定值或一定的时间函数&#xff0c;其值与流过它的电流i无关的元件叫理想电压源。 电路符号&#xff1a;中间与导线直通的圆圈 电压源&#xff1a…...

快乐数求解

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#xff0c…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...