Android中的像素密度,屏幕密度,屏幕大小,分辨率,ldpi,mdpi,xhdpi,xxhdpi

Android中的像素密度,屏幕密度,屏幕大小,分辨率,ldpi,mdpi,xhdpi,xxhdpiAndroid开发为适配不同屏幕需要在资源文件中添加多套图片或者多套布局文件,这篇文章讲解多套图片。ldpi,mdpi,xhdpi,xxhdpi,xxxhdpi分别代表什么?如何使用。1屏幕大小智能手机普及,屏幕也随之越来越大,从经典的iPhone4的3.5英寸到iphoneXR6英寸多,Android手机也逐渐进入了6.x英寸行列。屏幕大小定义:手机对角线的物理尺寸,以英寸(in…

大家好,又见面了,我是你们的朋友全栈君。

Android开发为适配不同屏幕需要在资源文件中添加多套图片或者多套布局文件,这篇文章讲解多套图片。
在这里插入图片描述
ldpi,mdpi,xhdpi,xxhdpi,xxxhdpi分别代表什么?如何使用。

1屏幕大小

智能手机普及,屏幕也随之越来越大,从经典的iPhone 4的3.5英寸到iphone XR 6英寸多,Android手机也逐渐进入了6.x英寸行列。
屏幕大小定义:手机对角线的物理尺寸,以英寸(inch)为单位,一英寸大约2.54厘米。
通常的手机尺寸:4英寸,4.5英寸,4.0英寸,5.0英寸,5.2英寸,5.4英寸,5.99英寸,6.0英寸,6.2英寸等
在这里插入图片描述

2 屏幕分辨率

屏幕分辨率:分辨率是手机屏幕的像素点总数,一般用屏幕宽的像素点数乘以屏幕高的像素点数。分辨率越大屏幕越细腻,能够显示的细节就更多。常用的分辨率包括320×240,640×480,1280×720,1280×960,1080×1920,2560×1440这些只是常用分辨率,所以分辨率还有很多其他数值,他们的单位都是像素。类似1080×1920表示屏幕宽度方向上有1080个像素,屏幕高方向上有1920个像素。

3 像素密度

像素密度(dpi,dots per inch;或PPI,pixels per inch):每英寸上的像素点数,结合屏幕大小和屏幕分辨率如果5.0英寸的手机的屏幕分辨率为1280×720,那么像素密度为192dpi(计算过程为首先计算对角线上的像素数)。

屏幕密度:
像素密度上面已经讲过了,那么什么是屏幕密度呢?
屏幕密度不知道如何定义,其实屏幕密度就是像素密度的另外一种表示,是以160dpi=1.0为基准的。手机出厂之后屏幕密度,包括X,Y轴方向的像素密度都是固定值。
android将实际的屏幕密度进行划分(low,medium,high,and extra high,extra extra high)
一般情况下的普通屏幕:ldpi是120dpi,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi ,xxhdpi 是480dpi。android以像素密度160dpi为基准对屏幕进行划分,当像素密度为160dpi时屏幕密度为1.0,像素密度为120dpi时屏幕密度为0.75,像素密度为320dpi时屏幕密度为2.0.
如何获取屏幕分辨率和像素密度,屏幕密度:

 private void getScreenInfo() { 
   
        // 获取屏幕分辨率
        int screenWidth  = getWindowManager().getDefaultDisplay().getWidth();		// 屏幕宽
        int screenHeight = getWindowManager().getDefaultDisplay().getHeight();		// 屏幕高

        Log.e( "屏幕分辨率", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);

        // 获取像素密度和屏幕密度
        DisplayMetrics dm = new DisplayMetrics();
        dm = getResources().getDisplayMetrics();

        float density  = dm.density;		// 屏幕密度(像素比例:0.75/1.0/1.5/2.0)
        int densityDPI = dm.densityDpi;		// 像素密度(每寸像素:120/160/240/320)
        float xdpi = dm.xdpi;               //X轴方向的像素密度
        float ydpi = dm.ydpi;                //Y轴方向的像素密度

        Log.e("XY轴方向上的像素密度", "xdpi=" + xdpi + "; ydpi=" + ydpi);
        Log.e( " 像素密度和屏幕密度", "density=" + density + "; densityDPI=" + densityDPI);

        screenWidth  = dm.widthPixels;		// 屏幕宽
        screenHeight = dm.heightPixels;		// 屏幕高

        Log.e("屏幕分辨率", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);

        // 获取屏幕密度(方法3)
        dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);

        density  = dm.density;
        densityDPI = dm.densityDpi;
        xdpi = dm.xdpi;
        ydpi = dm.ydpi;

        Log.e("屏幕XY轴方向上的像素密度", "xdpi=" + xdpi + "; ydpi=" + ydpi);
        Log.e("屏幕像素密度和屏幕密度", "density=" + density + "; densityDPI=" + densityDPI);

        int screenWidthDip = dm.widthPixels;
        int screenHeightDip = dm.heightPixels;

        Log.e("屏幕XY轴方向上的像素密度", "screenWidthDip=" + screenWidthDip + "; screenHeightDip=" + screenHeightDip);

        screenWidth  = (int)(dm.widthPixels * density + 0.5f);
        screenHeight = (int)(dm.heightPixels * density + 0.5f);

        Log.e(" 屏幕分辨率", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight); 
}

4 Android手机常见分辨率和drawable适配说明

手机常见尺寸和对应像素密度
4:3的尺寸
VGA :640×480 (Video Graphics Array)
QVGA :320×240 (Quarter VGA)
HVGA :480×320 (Half-size VGA)
SVGA :800×600 (Super VGA)
5:3的尺寸:
WVGA :800×480 (Wide VGA)
16:9的尺寸:
FWVGA: 854×480 (Full Wide VGA)
HD :1920×1080 High Definition
QHD :960×540
720p :1280×720 标清
1080p :1920×1080 高清

一般分辨率对应DPI:
“HVGA mdpi”
“WVGA hdpi “
“FWVGA hdpi “
“QHD hdpi “
“720P xhdpi”
“1080P xxhdpi “
nodpi里面的资源不会被缩放,无论尺寸是否满足条件。
此时会有一个疑问,手机的像素密度可以是任何值,Android手机只有mdpi,hdpi,ldpi,xhdpi,xxhdpi,xxxhdpi等有限的几个适配目录,Android手机如何适配呢,所以可以推测,Android中获取的屏幕密度,不是对应屏幕真实的屏幕密度值,类似1280720和1290730都会被认为是720p的手机,屏幕密度都是2.0。
注意:上面的一般分辨率对应的dpi只代表一般情况,绝大多数厂商都会遵循,这么说的意思是分辨率和像素密度不是上面的对应关系,还跟手机的尺寸相关,这就是我们看到的很多平板比手机大很多,但是它的分辨率依然是1080p,特别是现在很多智能车载比普通的平板还大,它的屏幕分辨率和普通手机一样,适配时可能只会用到mdpi目录。

各个drawable加载顺序:

android系统适配Drawable时会首先查找屏幕密度尺寸都满足的drawable,如果没有找到:
当应用在设备对应dpi目录下没有找到某个资源时,遵循“先高再低”原则,然后按比例缩放图片如果当前为xhdpi设备(项目中只有xxhdpi,xhdpi,xxhdpi,nodpi,mdpi,hdpi),则drawable的寻找顺序为,首先查找xhdpi目录 如果没找到,依然查找xxhdpi,如果还没有找到xxxhdpi,还没有找到查找nodpi,如果还没有查找hdpi,然后查找mdpi,如果在xxhdpi中找到目标图片,则压缩2/3来使用(因为系统认为它找到了一个比合适尺寸大的图片),如果在mdpi中找到图片,则放大2倍来使用(系统认为它找到了一个比适合尺寸小的图片,需要放大才能保证正常)。

5 为什么2017年以后Android手机适配一般只需要xhdpi和xxhdpi两套资源就可以

2017年以后的android手机一般大小在5寸以上,分辨率至少720p,1080p,所以对应的dpi分别为:
720p 1280720 5寸对应dpi 大约 300dpi
1080p 1920
1080 5寸对应dpi 大约440 dpi
xhdpi对应320dpi,xxhdpi对应480dpi,所以手机适配一般只需要xhdpi和xxhdpi两套资源就可以。

注意:对于平板,只能电视和车载系统的开发,一般xhdpi和xxhdpi用不到,ldpi,mdpi用的比较多

6 dp 和px的转换

dp是android中用于适配的尺寸,他能保证在不同尺寸密度屏幕上显示的大小相同,有点类似物理尺寸,相同的dp展示效果相同,它们代表的px是不一样的。
dp与px的转换
系统密度为160dpi的中密度手机屏幕为基准屏幕,即320×480的手机屏幕中,1dp=1px。
而在480×800(hdpi,240dpi)的手机上1dp=1.5px.所以dp和px的换算以屏幕密度为准则而不是屏幕的实际密度。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133560.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 在win10+Ubuntu双系统下,完美卸载Ubuntu

    在win10+Ubuntu双系统下,完美卸载Ubuntu背景机器:惠普暗影精灵3win10与Ubuntu均为UEFI分区清除ubuntu系统使用软件:diskgenius选择Ubuntu系统使用的几个分区,EFI分区也需要勾选若不确定Ubuntu系统分区,可通过【Windows+X】选择磁盘管理,通过分区大小进行对比判断我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点…

    2022年5月30日
    31
  • IIS发生意外错误0x8ffe2740

    IIS发生意外错误0x8ffe2740主要是端口冲突   因为要完成一段ASP程序的调试,因此需要配置本地服务器IIS(InternetInformationServer),但安装完成IIS组件,分配好本地IP、本地路径和启用默认文档后,打开浏览器输入127.0.0.1,发现没有打开预想的网页,访问出现了错误。再打开控制面板->管理工具->Internet信息服务,发现默认网站处于停止状态,于是单击鼠标右键,从展

    2022年7月26日
    5
  • 公安大数据平台应用与公安大数据建模「建议收藏」

    公安大数据平台应用与公安大数据建模「建议收藏」基于沃达德大数据平台,通过对海量数据采集、处理、存储、分析和数据挖掘,根据数据的特性,采用合适的可视化方式,将数据直观地展现出来,以帮助人们认识数据、理解数据,同时找出包含在海量数据中的规律或者信息。公安大数据主要由公安业务数据、地理信息数据、互联网数据等组成。通过沃达德大数据平台,对公安大数据进行信息提取、分析、数据挖掘和可视化,用于警情时空分布和时空演化、犯罪事件热点分析、关注对象的轨迹跟踪等多个公安业务领域,全面提升公安机关的整体工作效率。沃达德公安大数据平台,利用接警数据进行警情密度分析,以大数

    2022年6月6日
    201
  • Blob对象详解

    Blob对象详解第一步 聊聊概念 Blob BinaryLargeO 对象代表了一段二进制数据 提供了一系列操作接口 其他操作二进制数据的 API 比如 File 对象 都是建立在 Blob 对象基础上的 继承了它的属性和方法 第二步 两种使用方式 生成 Blob 对象有两种方法 一种是使用 Blob 构造函数 另一种是对现有的 Blob 对象使用 slice 方

    2025年9月4日
    2
  • 移除word文档的域代码 remove all field codes of word[通俗易懂]

    移除word文档的域代码 remove all field codes of word[通俗易懂]去除word中因使用mendeley或endnote等文献管理软件而产生的域代码。网上很多说使用CTRL+SHIFT+F9,但亲测不行,可能是软件版本问题。使用以下方法解决:CTRL+A全选文章;CTRL+6去除全文域代码。参考:https://community.endnote.com/t5/EndNote-Styles-Filters-and/Removing-field-codes-adjusts-spacing-in-Word-document/td-p/152892http

    2022年6月10日
    141
  • 单例模式和配置admin[通俗易懂]

    单例模式和配置admin

    2022年4月2日
    207

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号