Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android的分辨率

Android的分辨率

作者头像
forrestlin
发布于 2022-04-02 01:18:47
发布于 2022-04-02 01:18:47
1.2K8
举报
文章被收录于专栏:蜉蝣禅修之道蜉蝣禅修之道

这些术语都是指屏幕的分辨率。 VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素; HVGA:Half-size VGA;即:VGA的一半,分辨率为480×320; QVGA:Quarter VGA;即:VGA的四分之一,分辨率为320×240; WVGA:Wide Video Graphics Array;即:扩大的VGA,分辨率为800×480像素;

WQVGA:Wide Quarter VGA;即:扩大的QVGA,分辨率比QVGA高,比VGA低,一般是:400×240,480×272;

在设计之初,Android系统就被设计为一个可以在多种不同分辨率的设备上运行的操作系统。对于应用程序来说,系统平台向它们提供的是一个稳定的,跨平台的运行环境,而关于如何将程序以正确的方式显示到它所运行的平台上所需要的大部分技术细节,都由系统本身进行了处理,无需程序的干预。当然,系统本身也为程序提供了一系列API,所以在目标平台的分辨率是可以完全确定的情况下,程序也可以精确的控制自身在目标平台上的界面显示方式。   这个文档会说明系统平台究竟提供了哪些分辨率支持特性,与它们如何在程序中使用的信息。如果你遵循文档中列出的方法,就很容易让你的程序在所有支持的分辨率下都能完美显示。这样你就可以用一个单独的.apk文件,将你的程序发布到所有的平台上。   如果你已经发布过针对Android 1.5或更早版本平台的程序,你应该仔细阅读这篇文档,然后考虑一下到底如何让自己的老程序可以在拥有各种不同分辨率,并且运行着Android 1.6或更新平台上正常显示。在绝大部分情况下,只需要对程序作出小小的修改就可以达到目的,但你仍然需要尽可能地在各种分辨率的平台上进行测试。   特别的,如果你有一个已经完成的程序,又想让它可以在超低分辨率的设备(比如320×240)上正确运行,你需要阅读“老程序的更新策略”,那篇文档会告诉你应该怎么做。 术语和概念 屏幕尺寸 屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如2.8寸,3.5寸)。 简而言之,Android把所有的屏幕尺寸简化为三大类:大,正常,和小。 程序可以针对这三种尺寸的屏幕提供三种不同的布局方案,然后系统会负责把你的布局方案以合适的方式渲染到对应的屏幕上,这个过程是不需要程序员用代码来干预的。 屏幕长宽比 屏幕的物理长度与物理宽度的比例。程序可以为制定长宽比的屏幕提供制定的素材,只需要用系统提供的资源分类符long和notlong。 分辨率 屏幕上拥有的像素的总数。注意,虽然大部分情况下分辨率都被表示为“宽度×长度”,但分辨率并不意味着屏幕长宽比。在Android系统中,程序一般并不直接处理分辨率。 密度 以屏幕分辨率为基础,沿屏幕长宽方向排列的像素。 密度较低的屏幕,在长和宽方向都只有比较少的像素,而高密度的屏幕通常则会有很多——甚至会非常非常多——像素排列在同一区域。屏幕的密度是非常重要的,举个例子,长宽以像素为单位定义的界面元素(比如一个按钮),在低密度的屏幕上会显得很大,但在高密度的屏幕上则会显得很小。 密度无关的像素(DIP) 指一个抽象意义上的像素,程序用它来定义界面元素。它作为一个与实际密度无关的单位,帮助程序员构建一个布局方案(界面元素的宽度,高度,位置)。 一个与密度无关的像素,在逻辑尺寸上,与一个位于像素密度为160DPI的屏幕上的像素是一致的,这也是Android平台所假定的默认显示设备。在运行的时候,平台会以目标屏幕的密度作为基准,“透明地”处理所有需要的DIP缩放操作。要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式:pixels = dips * (density / 160)。举个例子,在DPI为240的屏幕上,1个DIP等于1.5个物理像素。我们强烈推荐你用DIP来定义你程序的界面布局,因为这样可以保证你的UI在各种分辨率的屏幕上都可以正常显示。 支持的屏幕分辨率范围 1.5及更早版本的Android系统,在设计的时候假定系统只会运行在一种分辨率的设备上——HVGA(320×480)分辨率,尺寸为3.2寸。由于系统只能工作在一种屏幕上,开发人员就可以针对那个屏幕来编写自己的程序,而无需去考虑程序在其他屏幕上的显示问题。 但自从Android 1.6以来,系统引入了对多种尺寸、多种分辨率屏幕的支持,以此满足拥有各种配置的新平台的运行需求。这就意味着开发人员在针对Android 1.6或更新版系统开发程序的时候,需要为自己的程序在多种分辨率的屏幕上良好显示作出额外的设计。 为了简化程序员面在对各种分辨率时的困扰,也为了具备各种分辨率的平台都可以直接运行这些程序,Android平台将所有的屏幕以密度和分辨率为分类方式,各自分成了三类: ·三种主要的尺寸:大,正常,小; ·三种不同的密度:高(hdpi),中(mdpi)和低(ldpi)。 如果需要的话,程序可以为各种尺寸的屏幕提供不同的资源(主要是布局),也可以为各种密度的屏幕提供不同的资源(主要是位图)。除此以外,程序不需要针对屏幕的尺寸或者密度作出任何额外的处理。在执行的时候,平台会根据屏幕本身的尺寸与密度特性,自动载入对应的资源,并把它们从逻辑像素(DIP,用于定义界面布局)转换成屏幕上的物理像素。 下表列出了Android平台支持的屏幕中一些比较常用的型号,并显示了系统是如何把它们分类到不同的屏幕配置里的。有些屏幕分辨率并不在下面的列表上,但系统仍会把它们归入下列的某一个类型中。

低密度(120),ldpi

中密度(160),mdpi

高密度(240),hdpi

小屏幕

·QVGA(240×320),2.6~3.0寸

普通屏幕

·WQVGA(240×400),3.2~3.5寸 ·FWQVGA(240×432),3.5~3.8寸

·HVGA(320×480),3.0~3.5寸

·WVGA(480×800),3.3~4.0寸 ·FWVGA(480×854),3.5~4.0寸

大屏幕

·WVGA(480×800),4.8~5.5寸 ·FWVGA(480×854),5.0~5.8寸

首先,一块屏幕有几个参数,屏幕的物理尺寸,分辨率,像素密度(Density, DPI)。

其中

  • 物理尺寸,就是所说的几寸的屏幕,代表屏幕对角线的长度,比如3.5寸、3.7寸、4寸、7寸等。
  • 分辨率,是屏幕总共能显示的像素数,通常我们都说几百×几百,比如240*320,320*480,480*800等,我们一般直接说乘后的结果。
  • 像素密度(DPI),DPI的全称是dots per inch,每英寸点数,还有个词是PPI,是每英寸像素数,其实PPI感觉更准确一些,这两个比较纠结,很多时候混用,这里就不明确区分了。(本文的意思都是“每英寸像素数”)

这三个参数,任两个确定后,第三个量就是确定了。公式为:分辨率(总像素数)= 物理尺寸 × 像素密度。

  • 比如一个3寸的屏幕,分辨率为240×320,那么密度为 开方(480x800/3.5) 约等于为160。
  • 再比如一个3.5寸的屏幕,分辨率为480×800,那么密度为 开方(480x800/3.5) 约等于为331。
  • 在比如一个3.5寸的屏幕,分辨率为960x640,那么密度为 开方(960x640/3.5) 约等于418。
  • 再比如一个4寸的屏幕,分辨率为480x800,那么密度为 开方(480x800/4) 约等于309。

面对种类旁杂的屏幕,开发人员该怎么办,人工针对不同屏幕做相应调整,No!

让机器调整!开发人员是天生懒惰的!

那么要调整什么,目的该是让界面元素的物理大小在所有设备上保持一致(但是屏大的似乎天然可以显示的大一点,小屏的可以小一点。)

过去,开发人员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清内容。

针对屏幕的三个参数,分析如下:

  • 同样物理尺寸,分辨率不同,那么如果按照像素设计,就会产生,分辨率大的那个,图像很小.物理尺寸就会很小.
  • 同样分辨率,不同物理尺寸,如果按钮找像素设计,实际看起来的物理比例是一样的.
  • 看起来物理尺寸一样,不同分辨率,分辨率大的,屏幕尺寸就要大.
  • 看起来物理尺寸一样,不同屏幕尺寸,大尺寸的,就要像素多.

那么Android框架为自动调整尺寸做了什么呢?

就是密度无关像素,原文如下

The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen.

是说,以160dpi为标准,在一个160dpi的屏幕上的1个物理像素作为设备无关像素的1个像素,也就是Android最佳实践中推荐的dip/dp(以下这两个单位表示同样含义,dip常见于Google官方示例中)这个单位。

针对于字体,Android设计了sp这个单位,这个于dp的不同在于,字体大小在dp的基础上,可以根据用户的偏好设置,相应调整字体大小,所以是scale的。

但是!

Android的做法不是根据160dpi这个标准值和设备实际的dpi的比值进行缩放!而是设定了一套标准化尺寸和密度:

  • 标准化物理尺寸: small, normal, large, and xlarge
  • 标准化屏幕密度: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)

Each generalized size or density spans a range of actual screen sizes or density. For example, two devices that both report a screen size of normal might have actual screen sizes and aspect ratios that are slightly different when measured by hand. Similarly, two devices that report a screen density of hdpi might have real pixel densities that are slightly different. Android makes these differences abstract to applications, so you can provide UI designed for the generalized sizes and densities and let the system handle any final adjustments as necessary. Figure 1 illustrates how different sizes and densities are roughly categorized into the different size and density groups.(摘自官方文档)

(我曾经以为,Android会根据实际dpi进行缩放,这也是我迷惑很久,之前写就在这个卡住了)

为了证明Android确实不是不是根据实际dpi进行缩放,我查阅了相关的源代码。

我们知道当显卡绘制一个图像的时候,是根据物理像素绘制的。所以,当开发人员设定dp这种单位的时候,需要一个转化过程,将sp转化为px。

如果按我之前所想,计算公式该是:实际dpi / mdpi(也就是160dpi)然后乘上sp的数值,这样就得到了在不同设备上物理大小完全一样的的界面元素。

但是Android不是这样设计的,正如前文所说,是根据那套标准化的密度来进行转换的。通过如下代码(这个是Android将dp转化为px值的过程)。

public static float applyDimension(int unit, float value, DisplayMetrics metrics) { switch (unit) { case COMPLEX_UNIT_PX: return value; case COMPLEX_UNIT_DIP: return value * metrics.density; case COMPLEX_UNIT_SP: return value * metrics.scaledDensity; case COMPLEX_UNIT_PT: return value * metrics.xdpi * (1.0f/72); case COMPLEX_UNIT_IN: return value * metrics.xdpi; case COMPLEX_UNIT_MM: return value * metrics.xdpi * (1.0f/25.4f); } return 0; }

可以看到,如果单位是dip(dp),那么返回值则是dip的value * metrics.density。

这里的density是

The logical density of the display. This is a scaling factor for the Density Independent Pixel unit, where one DIP is one pixel on an approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen), providing the baseline of the system's display. Thus on a 160dpi screen this density value will be 1; on a 120 dpi screen it would be .75; etc. This value does not exactly follow the real screen size (as given by xdpi and ydpi, but rather is used to scale the size of the overall UI in steps based on gross changes in the display dpi. For example, a 240x320 screen will have a density of 1 even if its width is 1.8", 1.3", etc. However, if the screen resolution is increased to 320x480 but the screen size remained 1.5"x2" then the density would be increased (probably to 1.5). (摘自Google官方文档,懒得翻译了,当然也是怕翻译坏了原来的味道,这段还是相当重要的)

重点是This value does not exactly follow the real screen size。这也解释我之前的疑惑。

这个density值Displaymetrics记录的,如果你想看看实际情况,可以获取Displaymetrics,通过代码:

DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics);

然后就能得到metrics的值。

另外!

这类还有xdpi和ydpi这两个值,官方文档上说:The exact physical pixels per inch of the screen in the X(Y) dimension.

然而,当我试图获取某些机器的这两个值的时候却与我手动计算所得到的值完全不同!

后来翻阅StackOverflow,看到也有人遇到类似问题,

作者获得了几个设备的dip值,如下:

  • HTC Desire Z: 480x800, density : HIGH, xdpi: 254.0, ydpi: 254.0
  • Motorola Defy: 480x854, density : HIGH, xdpi: 96.0, ydpi: 96.0
  • Samsung Galaxy S2: 480x800, density : HIGH, xdpi: 217.71428, ydpi: 218.49463
  • LG Optimus 2X: 480x800, density : HIGH, xdpi: 160.0, ydpi: 160.0

(原文地址: http://stackoverflow.com/questions/6224900/android-incorrect-size-for-views-with-mm-or-inch-dimensions

可以看到对于Moto和LG的dpi是明显错误的。

再回想刚才Android转换单位的函数里面这段代码:

case COMPLEX_UNIT_PT: return value * metrics.xdpi * (1.0f/72); case COMPLEX_UNIT_IN: return value * metrics.xdpi; case COMPLEX_UNIT_MM: return value * metrics.xdpi * (1.0f/25.4f);

对于这几个单位的处理都用到了xdpi,所以很可能转换后是错误的值, (这里应该仍然算是个疑问,难道真的没有办法得到正确的值吗?我们都知道是不推荐用pt,in,mm这种单位的,这是否也是一个方面)

至此关于屏幕的问题大体说完,然后就是提供的资源问题,当我们设置了一个界面元素的的大小后,对于不是标准dpi的机器上就要进行缩放,那么对于绘制的矢量元素,自然是不用管,而对于图像这种位图,缩放后会导致模糊等问题,所以就要对标准化dpi的几个大小,提供相应的替换版本,Android会根据实际屏幕规格,进行相应替换,并且有相应的查找资源的规则,看Android源码,可以知道,Android的框架的默认ui使用了大量nine-patch图片。这里就不详细说了。

好吧,这次就到这里了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
8 条评论
热度
最新
新蓝天
新蓝天
回复回复点赞举报
天水蓝天工程机械职业技术培训学校
天水蓝天工程机械职业技术培训学校
回复回复点赞举报
自然和谐一蓝天世界职业技能教育培训
自然和谐一蓝天世界职业技能教育培训
回复回复点赞举报
蓝天世界易经科技
蓝天世界易经科技
回复回复点赞举报
代金券可以叠加使用吗
代金券可以叠加使用吗
回复回复点赞举报
非常棒的活动,加入加入!!!不多说了,我去加入~
非常棒的活动,加入加入!!!不多说了,我去加入~
回复回复点赞举报
已经加入了腾讯云的自媒体分享计划哦。嘻嘻
已经加入了腾讯云的自媒体分享计划哦。嘻嘻
回复回复点赞举报
给力,去邀请自己的自媒体朋友来搞啊!
给力,去邀请自己的自媒体朋友来搞啊!
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Android 屏幕适配之框架(AndroidAutoSize)(今日头条)适配
https://github.com/JessYanCoding/AndroidAutoSize
全栈程序员站长
2022/09/05
1.7K0
Android 屏幕适配之框架(AndroidAutoSize)(今日头条)适配
【Android 应用开发】Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19698511
韩曙亮
2023/03/27
7350
【Android 应用开发】Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题
android手机分辨率
4:3 VGA 640*480 (Video Graphics Array) QVGA 320*240 (Quarter VGA) HVGA 480*320 (Half-size VGA) SVGA 800*600 (Super VGA)
用户9854323
2022/06/25
9150
android手机分辨率
Android中的像素密度,屏幕密度,屏幕大小,分辨率,ldpi,mdpi,xhdpi,xxhdpi
Android开发为适配不同屏幕需要在资源文件中添加多套图片或者多套布局文件,这篇文章讲解多套图片。
全栈程序员站长
2022/06/27
6.6K0
Android中的像素密度,屏幕密度,屏幕大小,分辨率,ldpi,mdpi,xhdpi,xxhdpi
2014-10-25Android学习------布局处理(二)----软件的版本介绍布局---颜色---像素
我学习Android都是结合源代码去学习,这样比较直观,非常清楚的看清效果,觉得很好,今天的学习源码是网上找的个HealthFood 源码
wust小吴
2022/03/07
3310
2014-10-25Android学习------布局处理(二)----软件的版本介绍布局---颜色---像素
AndroidAutoSize开源库屏幕适配分析[通俗易懂]
https://github.com/JessYanCoding/AndroidAutoSize
全栈程序员站长
2022/09/06
5K0
Android的px、dp和sp
即像素,1px代表屏幕上一个物理的像素点;偶尔用到px的情况,是需要画1像素表格线或阴影线的时候。
全栈程序员站长
2022/07/15
4130
Android中图片大小和屏幕密度的关系讲解
Android手机适配是非常让人头疼的一件事,尤其是图片,android为了做到是适配提供了很多文件夹来存放不同大小的图片,比如:drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi等,其实同一张内容的图片放到上面不同的文件夹中是有区别的,可能你会问:如果在上述各个文件夹中都放置一张内容相同,尺寸不同的图片,那么系统会选择加载哪一张图片呢?这个问题,系统有内部的选择机制,简单来说:系统会选择最接近手机屏幕密度的图片。
非著名程序员
2018/02/01
1.2K0
Android中图片大小和屏幕密度的关系讲解
为 DP 设计布局
什么是屏幕尺寸、屏幕分辨率、屏幕像素密度? 什么是dp、dip、dpi、sp、px?他们之间的关系是什么? 什么是mdpi、hdpi、xdpi、xxdpi?如何计算和区分? 题图中的每一个矩形都代表着一种Android设备。Android系统碎片化问题的严重性,让我们不得不面对屏幕适配的问题。 屏幕尺寸: 屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米。 比如常见的屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等。 屏幕分辨率: 屏幕分辨率是指在横纵向上的像
阿凯
2018/06/29
5980
Android中你可能忽略的知识点(1)-分辨率那些事
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/80265069
Hankkin
2018/09/06
9700
Android中你可能忽略的知识点(1)-分辨率那些事
适配完结篇一 - 超快速的Android屏幕适配方式
由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果,适配成本越来越高。虽然Android官方提供了dp单位来适配,但其在各种奇怪分辨率下表现却不尽如人意,因此下面探索一种简单且低侵入的适配方式。
acc8226
2022/05/17
9420
适配完结篇一 -  超快速的Android屏幕适配方式
移动应用界面设计的尺寸规范「建议收藏」
移动应用的界面设计画布尺寸设计多大(特别是Android)、图标和字体大小怎么定、需要设计多套设计稿么、如何切图以配合开发的实现? 本篇将结合iOS和android官方的设计规范、搜集的资料以及工作中的摸索,来分享移动应用界面设计中的尺寸规范等问题,希望能给移动端的新手设计师些许指引。若有不当之处,欢迎斧正。
全栈程序员站长
2022/06/25
5.7K0
移动应用界面设计的尺寸规范「建议收藏」
Android中的单位(dp、sp、dpi)
概述 因为不同的屏幕具有不同的像素密度,因此同样数量的像素在不同设备上可能对应于不同的物理尺寸。因此要使用 dp和 sp单位。 dp:是一种密度无关像素,对应于160dpi下像素的物理尺寸。 sp:
用户1205080
2018/10/18
2K0
Android中的单位(dp、sp、dpi)
布局文件中的sp、dp还有px的区别
众所周知,Android厂商非常多,各种尺寸的android手机、平板层出不穷。导致了Android生态环境的碎片化现象越来越严重。Google公司为了解决分辨率过多的问题,在Android的开发文档中定义了px、dp、sp,方便开发者适配不同分辨率的Android设备。对于初级程序员来说理解掌握适配的一些基础知识是必须的。
233333
2020/06/15
2.4K0
布局文件中的sp、dp还有px的区别
Android全面的屏幕适配方案解析(四)__今日头条适配方案
之前三篇把屏幕适配概念梳理了还讲解了列举的其中四种适配方案,还没有看过的童鞋可以先参考这三篇: Android全面的屏幕适配方案解析(一)__屏幕适配概念梳理 Android全面的屏幕适配方案解析(二)__宽高限定符屏幕适配 Android全面的屏幕适配方案解析(三)__sw限定符适配方案 Android全面的屏幕适配方案解析(四)__今日头条适配方案
SoullessCoder
2022/03/23
1.6K0
Android全面的屏幕适配方案解析(四)__今日头条适配方案
像素密度计算
大家好,又见面了,我是你们的朋友全栈君。 为解决Android设备碎片化,引入一个概念density,也就是密度.它指的是在一定尺寸的物理屏幕上显示像素的数量,一般使用dpi(dots per inch,每英寸像素数)作为单位. 比如设备分辨率为240×320,屏幕物理尺寸为1.5英寸x2英寸(对角线为2.5), 它的密度可以用分辨率/尺寸表示:240/1.5或者即320/2,密度为160dpi。 算对角线也是一样的, 长的平方+宽的平方=160000,开方后=400.可知400/2.5=160.
全栈程序员站长
2022/07/01
6480
Android获取屏幕分辨率及DisplayMetrics简介[通俗易懂]
Android 可设置为随着窗口大小调整缩放比例,但即便如此,手机程序设计人员还是必须知道手机屏幕的边界,以避免缩放造成的布局变形问题。
全栈程序员站长
2022/07/20
4.3K0
Android获取屏幕分辨率及DisplayMetrics简介[通俗易懂]
Android TV开发总结【适配】
Android 的屏幕适配是指适配不同机顶盒 UI 框架层输出的分辨率和 dpi,而不是适配不同分辨率的电视机(电视机的适配交由机顶盒本身完成,和各个应用无关)
先知先觉
2019/01/21
4.2K0
Android UI 开发里的尺寸单位理解
在学习 Android UI 开发的初期,经常被一些常用概念如 dp、sp 和它们与 px 的换算等虐,要避免被虐,最好的方法当然是知其所以然,再见到它们就胸中有料心不慌了。
零式的天空
2022/03/28
4280
Android 获取屏幕尺寸与密度
android中获取屏幕的长于宽,参考了网上有很多代码,但结果与实际不符,如我的手机是i9000,屏幕大小是480*800px,得到的结果却为320*533
阳光岛主
2019/02/19
2.7K0
推荐阅读
相关推荐
Android 屏幕适配之框架(AndroidAutoSize)(今日头条)适配
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档