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

news/2024/9/23 7:28:19/

--张学友《心如刀割》很好听

 

 先说几个术语:

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 设备上更加准确地计算屏幕尺寸,适用于需要精确测量屏幕尺寸的场景。

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


http://www.ppmy.cn/news/1510607.html

相关文章

关于鸿蒙开发中滚动容器Scroll的介绍

当子组件的布局尺寸 超过Scroll的尺寸 时&#xff0c;内容可以滚动。 Scroll的核心用法 用法说明&#xff1a; Scroll设置尺寸设置溢出的子组件【只支持一个子组件】滚动方向&#xff1a;支持横向和纵向&#xff0c;默认纵向 Scroll(){// 只支持一个子组件Column(){// 内容…

解析 Vue 中的app.version、 app.provide 与 app.runWithContext :原理、应用与实例剖析

目录 app.provide app.runWithContext ​​​​​​​app.version 非 VIP 用户能够通过积分下载博文资源 app.provide 在 Vue 3.0 中,app.provide充当着在应用层级提供全局共享数据或者服务的关键角色。 app.provide(key, value) 这一方法接收两个关键参数,其中 …

13、14代CPU故障迎来结局,intel或将卖大楼了

AMD 本应该在上个月就发布的锐龙 9000 系列&#xff0c;终于在 8 月 8 日正式上市了。 新一代的 Ryzen 9000 尽管在性能上属于中规中矩的常规迭代&#xff0c;但是因为 IPC 的进步和先进工艺的加持下&#xff0c;积热问题带来了极大的改善。 相较于 AMD 这边的春风得意&#x…

JS UI库DHTMLX Suite v8.4全新发布——图表、网格组件等API全面升级

DHTMLX UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件&#xff0c;这些组件可以轻松组合到单个应用程序界面中。DHTMLX JS UI 组件可用于任何服务器端技术&#xff1a;PHP、Java、ASP.NET、Ruby、Grails、ColdFusion、Pyt…

笔记 5 : 彭老师课本第 5 章 , 开始代码编程

&#xff08;49&#xff09;大纲&#xff1a; &#xff08;50&#xff09; 系统&#xff1a; &#xff08;51&#xff09; 学习路线&#xff1a; &#xff08;52&#xff09;该款 soc 的内存布局&#xff1a; 细化的 SFR 地址空间 &#xff1a; &#xff08;53&#xff09; soc…

使用 Vue 官方脚手架初始化 Vue3 项目

Vite 官网&#xff1a;https://cn.vitejs.dev/ Vue 官网&#xff1a;https://vuejs.org/ Vue 官方文档&#xff1a;https://cn.vuejs.org/guide/introduction.html Element Plus 官网&#xff1a;https://element-plus.org/ Tailwind CSS 官网&#xff1a;https://tailwindcss.…

坐牢第二十七天(聊天室)

基于UDP的网络聊天室 一.项目需求&#xff1a; 1.如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息 2.如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息 3.如果有人下线&#xff0c;其他用户可以收到这个人的下线信息 4.服务器可以发送系统信息…

liblzma库Android平台编译

1.下载源码: git clone https://github.com/tukaani-project/xz.git --recursive 2.配置交叉编译环境: 生成Android平台makefile export ANDROID_API=25 export ANDROID_NDK=/opt/aarch64-darwin-android export ANDROID_NDK_REVISION=r25b export AR=/opt/aarch64-darwin-a…