Android dp px ppi pt等概念的理解

2023-11-06

做Android开发过程中,总会用到px、dp、pt等概念,下面对它们代表的意义以及互相之间的关系做简单的介绍。

目录

1、px
2、ppi
3、pt
4、dp
5、Android获取屏幕状态信息

1、px 像素

就是一个颜色点,一个像素点,最小的单位。不同的颜色点组成一张图像,因此图像的基本单位是像素px。它是一个相对单位,在不同的密度单位下能变大变小。同样是1英寸的屏幕,密度越大,像素越多,则单个像素的物理尺寸越小。
像素数量px = 像素密度ppi x 屏幕尺寸in
所以在屏幕尺寸一定的情况下,密度越大,像素数量越多,显示效果就会越清晰。看下图:
在这里插入图片描述
像素px主要用来描述图像大小和显示器分辨率:
1) 相机所说的像素,其实就是最大像素的意思,像素是分辨率的单位,这个像素值仅仅是相机所支持的有效最大分辨率。
30万 640*480
50万 800×600
80万 1024×768 5” (3.5×5英寸)

2) 我们常说一张100kb大小的图片,指的是图片的体积。一张图像在存储时,会描述每个像素点的颜色信息、位置、数量,这些描述数据就是图片的体积,如果像素越多自然图像体积越大。

2、ppi 像素密度

指的是1英寸屏幕上显示的像素量,密度单位。决定图片的物理显示尺寸,只有涉及到显示才有意义。值越大,显示越细腻。
英寸是使用于联合王国(UK,即英国(英联邦)及其前殖民地的长度单位,一般为1英寸=2.54cm;
像素密度的直观衡量有三个关键指标:
1)每寸像素量:它指的是每平方英寸所含有的像素数量,单位为DPI;
2)像素面积:它指的是屏幕上每个像素占据的物理空间,单位为毫米;
3)像素尺寸:它指的是屏幕上每个像素的尺寸,单位为英寸。

计算公式: ppi=屏幕对角线上的像素量px/对角线长度inch = √(屏幕横向像素^2 + 屏幕纵向像素^2)/对角线长度。
在这里插入图片描述
在这里插入图片描述
比如 iphone6的ppi是多少?ppi=√(750px²+1334px²)/4.7in=326ppi。

其实我们日常所说的分辨率有两个概念。一个指显示器的分辨率,另一个是图像的分辨率:

1)显示器分辨率指显示器所能显示的像素多少。屏幕尺寸一定时,分辨率越大,像素密度越大,显示器可显示像素越多,画面就越精细。
2)图像分辨率则是单位英寸中所包含的像素点数,比如photoshop里新建画布时设置的图像分辨率是300ppi,其定义更趋近于分辨率本身的定义。

3、pt

这里只说iOS开发时使用的pt,pt是iOS系统的开发单位,而且是长度固定的,不随屏幕像素密度ppi变化而变化。
苹果公司规定:普屏时1px=1px,而普屏的ppi=163像素/英寸,那么pt=1/163英寸=0.16mm(固定值)。普屏1px=1px,高清屏1pt=2px。

用固定长度pt作为开发单位的好处是,这样可以保证同一张图片在不同设备上显示大小一样,因为pt值是固定的。高清屏上1pt等于更多的像素px,因为像素在高清屏上变小,所以pt还是固定的。

4、dp

dp是安卓的开发单位,也是一个固定长度的单位。
根据不同的屏幕分辨率,和px有不同的倍数关系。规定: 1dp等于屏幕像素密度为160ppi时1px的长度。
公式:1dp = (屏幕ppi/160)px。
在这里插入图片描述
现在我们知道,mdpi就是屏幕像素密度为160,那么就以它为标准吧,这些屏幕密度的比值是 ldpi : mdpi : hdpi : xhdpi : xxhdpi = 0.75 : 1 : 1.5 : 2 : 3。
安卓中清屏 1dp = 1px 高清屏 1dp = 1.5px 超清屏 1dp = 2px
一般做设计的时候以xhdpi为模板,xhdpi条件下 1dp = 2px,标注长度的时候,将长度像素除以2即为dp值,方便沟通。
在Android中像素密度可以通过下面的方式获取:

getResources().getDisplayMetrics().densityDpi

所以px与dp的转换方式如下:

public static float pxToDp(float px) {
	dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
	float densityDpi = dm.densityDpi;
	return px / (densityDpi / 160f);
}
 
public static int dpToPx(float dp) {
	dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
	float density = dm.density;
	return Math.round(dp * density);
}

5、Android获取屏幕状态信息

1)可以用过adb获取到屏幕的一些参数信息:
使用adb修改屏幕像素密度 (此命令针对全志开发板子)
adb shell am display-density 120
获取Android设备屏幕分辨率:
adb shell wm size
获取android设备屏幕密度:
adb shell wm density
修改屏幕像素密度
adb shell wm resize 1920*1080
adb shell wm size 540×960
重置屏幕尺寸大小
adb shell wm size reset
设置屏幕dpi (常用的dpi有160mdpi, 240hdpi, 320xhdpi, 480xxhdpi)
adb shell wm density 320
重置可用dpi如下命令
adb shell wm density reset

2)Android中通过方法获取屏幕信息的方法如下:

private String getScreenParams() {
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int heightPixels = dm.heightPixels;//高的像素
        int widthPixels = dm.widthPixels;//宽的像素
        int densityDpi = dm.densityDpi;//dpi
        float xdpi = dm.xdpi;//xdpi
        float ydpi = dm.ydpi;//ydpi
        float density = dm.density;//density=dpi/160,密度比
        float scaledDensity = dm.scaledDensity;//scaledDensity=dpi/160 字体缩放密度比
        float heightDP = heightPixels / density;//高度的dp
        float widthDP = widthPixels / density;//宽度的dp
        String str = "heightPixels: " + heightPixels + "px";
        str += "\nwidthPixels: " + widthPixels + "px";
        str += "\ndensityDpi: " + densityDpi + "dpi";
        str += "\nxdpi: " + xdpi + "dpi";
        str += "\nydpi: " + ydpi + "dpi";
        str += "\ndensity: " + density;
        str += "\nscaledDensity: " + scaledDensity;
        str += "\nheightDP: " + heightDP + "dp";
        str += "\nwidthDP: " + widthDP + "dp";

        return str;
    }
//打印信息
	heightPixels: 2235px
    widthPixels: 1080px
    densityDpi: 480dpi
    xdpi: 391.885dpi
    ydpi: 412.75dpi
    density: 3.0
    scaledDensity: 3.0
    heightDP: 745.0dp
    widthDP: 360.0dp
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android dp px ppi pt等概念的理解 的相关文章

  • 如何为android数据绑定点击监听器编写proguard规则?

    我在用databinding在我的应用程序中 它运行良好 但是当我启用minifyEnabled true and shrinkResources true比它告诉我一些错误 Execution failed for task app tr
  • 使用匕首柄作为依赖注入来处理多个改造客户端?

    我想在我的 android 应用程序中使用两个不同的后端 具有不同的响应格式 我使用 hilt 作为依赖注入 并对网络调用进行改造 这非常适合工作 因为我已经添加了第二个服务器网络文件和应用程序模块 所以它给了我错误 该错误列在最后 我需要
  • 如何用Android做交互动画(翻译)

    我在 Android 中有一些 png 序列 我需要将它们的 x 和 y 位置从屏幕顶部到底部的翻译动画化 当动画发生时 我需要对象来接收单击事件 我知道这在 3 0 之前的 Android 版本中效果不太好 因为display对象的位置与
  • 即使我单击“运行”,Eclipse 也会运行调试模式

    Eclipse 总是在调试模式下启动我的应用程序 即使我单击常规的 运行 按钮 有任何想法吗 我发现我必须重新启动 Xoom 才能使其再次正常工作
  • 配置项目 ':react-native-gesture-handler' 时出现问题

    大家好 我已经尝试了很长时间来解决这个问题 但不幸的是我还没有弄清楚如何解决 希望你们能帮助我 所以我有一个反应本机项目和我的朋友 以及我的一位朋友添加 React native gesture handler 包供我们使用 他对这个包没有
  • 在 Android 中使用 awt

    我有一个绘制图表的 Java Swing 应用程序 它使用 Graphics2D 调用和 awt 对象 例如 Rectangle 等 在某些时候我可能想将其移植到 Android 上 我知道我无法在 Android 上使用 Graphics
  • 如何使用retrofit2动态设置超时?

    public class Router private static Retrofit retrofit null public Retrofit getRetrofit if retrofit null OkHttpClient clie
  • 与通用地图相比,MapView 的分辨率较差

    我刚刚收到 HTC Desire 进行测试 我注意到 残留在小于整个屏幕的框架中的地图视图不如通用地图应用程序那么清晰 有什么办法解决这个问题吗 您应该使用 API 级别 4 或更高级别编译应用程序 然后在 AndroidManifest
  • 如何最大限度地减少 Google API(地点)自动完成的请求量?

    我正在使用 google API 位置来自动完成位置AutoCompleteTextView 我做了几次测试 大概进行了 20 次搜索 在我的 google devs 个人资料中 写着我已经发出了 200 个 API 请求 据我所知 每次我
  • 何时调用 glMatrixMode()

    我所关注的大多数 Android OpenGL ES 教程都有其 onSurfaceChanged 函数 如下所示 public void onSurfaceChanged GL10 gl int width int height gl g
  • 添加 play-services-maps 依赖项自动添加 glEsVersion 2.0 要求

    我想融入Google Play Services Maps module 由于地图清单声明
  • 如何在Room的数据库迁移中正确添加索引?

    我在迁移 Room 数据库时遇到问题 在更新的数据库中 我必须将一个字段从整数更改为双精度值 我读到它并不像听起来那么容易 为了做到这一点 我必须使用这个更改后的属性创建新的临时表 复制前一个表中的所有值 删除旧的值 最后重命名临时表 我的
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • DialogFragment 关闭事件

    我需要处理 DialogFragment 的结尾 在调用 dismiss 之后 例如 我会在关闭后 包含 片段的活动内显示一个 toast 我该如何处理该事件 覆盖onDismiss 在你的DialogFragment中 或者使用setOn
  • Android:从 PhoneGap 应用打开 Play 商店链接

    我想从我的phonegap 3 4 应用程序打开一个指向Google Play 商店的链接 呼唤market details id com google android apps maps导致 ActivityNotFoundExcepti
  • onStart() 到底做了什么? - 安卓[重复]

    这个问题在这里已经有答案了 一段时间以来 我一直想知道 onStart 函数在 android 生命周期中的确切作用 网上的大多数资源只是说 它在您的活动在屏幕上可见之前被调用 但到目前为止我所做的应用程序我从未使用过onStart 我在
  • 活动中列表视图中的粘滞行

    我的列表视图中只有一行应该是粘性的 而不是粘性标题中带有字母的部分或部分 我真的很感激任何关于列表视图在活动中粘性一行而不是片段的帮助 我该怎么做 我真的很感谢任何帮助 提前致谢 使用如下代码 class MyAsyncTask exten
  • Android - 检测视图上的双击和三次点击

    我一直在尝试构建一个可以检测双敲击和三敲击的敲击检测器 在我的努力失败后 我在网上搜索了很长时间以找到可以使用的东西 但没有运气 奇怪的是 像这样的图书馆如此稀缺 有什么帮助吗 你可以尝试这样的事情 尽管我通常建议不要使用三次点击作为一种模
  • Android SDK WebView调用Activity

    我试图在单击 WebView 组件内的链接时启动活动 我的Webview已加载到里面Main java我想启动SubActivity java当点击网站内的链接时Main java 另外 如何将参数传递给此活动 Example inspec
  • 使用 PDFBox 在 Android 中创建 PDF

    我正在尝试通过我的 Android 应用程序创建 PDFPDFBoxapi 但出现以下错误 java lang NoClassDefFoundError org apache pdfbox pdmodel PDDocument 我已经将以下

随机推荐

  • A-2 LRU-K(攀拓(PAT)- 程序设计(甲级)2023年春季考试仿真卷)

    A 2 LRU K 分数 25 作者 陈越 单位 浙江大学 Least Recently Used LRU cache scheme is to remove the least recently used frame the one ha
  • T分布和T检验的理解,Python代码实现T检验的计算

    每天学习一点 每天进步一点 声明 本人所有的原创 都是自己在学习过程中的记录点滴 不一定都是对的 肯定也会有一些错误的想法 所以大家看一看就好 不可尽信 当然也欢迎指出 T分布 定义 有来自标准正态分布的样本X N 0 1 和来自卡方n分布
  • git lfs的用法及安装遇到的问题-Windows版本

    在使用git lfs的时候遇到了各种问题 遍寻无果 最后终于摸索出来了 现将摸索出来的成功下载文件的过程和方法总结如下 在下载GitHub上程序和数据的时候发现下载的数据为 csv格式 但是打开却出现了意义不明的乱码 然后我打开了versi
  • Jmeter性能测试 (入门)

    Jmeter是一款优秀的开源测试工具 是每个资深测试工程师 必须掌握的测试工具 熟练使用Jmeter能大大提高工作效率 熟练使用Jmeter后 能用Jmeter搞定的事情 你就不会使用LoadRunner了 本文将通过一个实际的测试例子 来
  • XDOJ最长单词的长度

    试题名称 最长单词的长度 时间限制 1 秒 内存限制 256KB 问题描述 给定一个英文句子 统计这个句子中最长单词的长度 并在屏幕上输出 输入说明 从键盘输入一个英文句子 句子中只含有英文字符和空格 句子以 结束 句子总长不超过100个字
  • Linux shell:脚本读取文件内容赋给变量的三种方式

    前段时间用到读取配置文件的相关信息 搜索到一些比较好的方法 整理一下作为笔记方便以后查看 先假设现在有一个配置文件net config 内容如下 ID 123 IP 192 168 1 1 Name test 现在我们可以通过以下三种脚本读
  • C++ 点圆运算(构造与析构)

    题目描述 设计一个点类Point 包含私有属性x坐标和y坐标 操作包括 1 构造函数 要求满足两个条件 1 能够使用类Point去创建一个对象数组 缺省构造方法 2 能够接收外来输入的x和y坐标做初始化 提示 构造函数重载 2 析构函数 把
  • Windows Server 2012 R2 -网站—安全设置-IP限制连接(VMware workstation环境)

    安装IP和域限制组件 拒绝特定地址或范围 可选拒绝类型 401 未经授权 403 已禁止 404 未响应 中断 中止 启用域名限制 可以通过域名限制连接 也可以限制一个域 sayms local 启用代理模式 若被限制的客户端通过代理服务器
  • Maven创建Web项目时如何设置JDK的版本

    使用命令 mvn Dwtpversion 1 0 eclipse eclipse 之后 导入的项目 Project Facet 的 java 还是 1 4 而当前使用的 Eclipse 上的设置是高于1 4版本 此时可以通过设置pom插件来
  • Java VisualVM 插件地址,安装Visual VM插件,修改下载插件地址使插件可以直接在JVisualVM中进行下载

    Java VisualVM 插件地址 打开Java VisualVM检查更新插件时 默认的连接连不上 通过浏览器访问之后发现默认的服务器已经404 新地址已经迁移到github 下面这个地址里面有不同版本jdk对应的插件中心地址 https
  • 2003-2019年上市公司治理水平(含原始数据和具体计算过程stata代码)

    2003 2019年上市公司治理水平 1 数据来源及数据说明在压缩包内 2 时间跨度 2003 2019年 3 区域范围 3669家上市公司 4 指标说明 该指标计算的方法的do文件以及参考文献都放在文件中 有需要的小伙伴可以自取 运用主成
  • __declspec(dllexport)与__declspec(dllimport)

    区别 他们都是DLL内的关键字 即导出与导入 他们是将DLL内部的类与函数以及数据导出与导入时使用的 dllexport是在这些类 函数以及数据的申明的时候使用 用他表明这些东西可以被外部函数使用 即 dllexport 是把 DLL中的相
  • Idea Git 已提交代码版本回滚

    本文主要记录在 Idea 中 如何通过 Git 回滚本地仓库和远程仓库代码版本 一 提交本地仓库代码回滚 1 模拟提交到本地仓库 模拟一次提交 提交到本地仓库 未提交到远程仓库 本地仓库 有 远程仓库 无 2 复制提交版本号 复制你想回到的
  • Unity 3D 碰撞体(Collider)

    在游戏制作过程中 游戏对象要根据游戏的需要进行物理属性的交互 因此 Unity 3D 的物理组件为游戏开发者提供了碰撞体组件 碰撞体是物理组件的一类 它与刚体一起促使碰撞发生 碰撞体是简单形状 如方块 球形或者胶囊形 在 Unity 3D
  • 面渣逆袭:分布式十二问,万字图文详解

    大家好 我是老三 不管今年金三银四如何 面渣逆袭系列继续 这期我们来看看分布式 分布式理论 1 说说CAP原则 CAP原则又称CAP定理 指的是在一个分布式系统中 Consistency 一致性 Availability 可用性 Parti
  • DS18B20测量温度

    文章目录 一 DS18B20读取温度步骤 二 初始化复位时序 2 发送一个字节 二 读取数据 1 读取一个Bit 2 读取一个字节 三 启动温度转换 四 判断转换完成 五 读取温度 程序地址 一 DS18B20读取温度步骤 一般在使用DS1
  • 【算法练习】最多等和不相交连续子序列

    200分 题目描述 给定一个数组 我们称其中连续的元素为连续子序列 称这些元素的和为连续子序列的和 数组中可能存在几组连续子序列 组内的连续子序列互不相交且有相同的和 求一组连续子序列 组内子序列的数目最多 输出这个数目 输入描述 第一行输
  • 计算机显卡设置方法,显卡在哪里设置 显卡设置方法【详细介绍】

    电脑中最重要的地方就是显示了 因为电脑cpu的高度运算和计算数据都是因为显卡在一直工作 所以很好的显卡设置能让我们的电脑使用和运行上更加完美 很多人会问那么显卡在哪里设置呢 怎么设置才好呢 想知道就和小编一起看下来吧 显卡在哪里设置 1 显
  • 怎么能跳过苹果服务器降级系统,苹果ios11手机怎样将系统降级?简单三步即可完成降级!...

    近日 苹果偷偷开启了降级通道 那些想降级回iOS 10的小伙伴现在有机会了 那么iPhone手机如何降级 下面为大家带来iOS 11降级教程 一起来看看 iOS 11降级教程 iPhone 5 5S 6 6S 7系列机型的老版本固件 苹果都
  • Android dp px ppi pt等概念的理解

    做Android开发过程中 总会用到px dp pt等概念 下面对它们代表的意义以及互相之间的关系做简单的介绍 目录 1 px 2 ppi 3 pt 4 dp 5 Android获取屏幕状态信息 1 px 像素 就是一个颜色点 一个像素点