Android 关于"尺寸"的那些事(dp,dip,sp,pt,px...)

作者&投稿:悟要 (若有异议请与网页底部的电邮联系)
~

屏幕大小:屏幕大小是手机对角线的物理尺寸,以英寸inch为单位。比如我的Mix 2手机屏幕大小为5.99 inches,意味着我的屏幕对角线长度为5.99inches = 5.99 * 2.54 = 15.2146cm

分辨率:屏幕的像素点数,一般表示为a*b。例如某手机分辨率为21601080,意味着手机屏幕的竖直方向(长)有2160个像素点,水平方向(宽)有1080个像素点。

px :Pixels ,像素;对应屏幕上的实际像素,是画面中最小的点(单位色块),像素大小没有固定长度值,不同设备上1个单位像素色块大小不同。

这么说可能有点陌生,用屏幕分辨率来说,今年流行起来的“全面屏”分辨率是 2160*1080,但是你也可以发现,虽然很多全面屏手机分辨率一样,但是明显看得出来屏幕大小不一样,这也解释了“不同设备像素色块大小是不同的”。

pt :1pt=1/72 inch,用于印刷业,非常简单易用;

dpi :Dots Per Inch,每英寸点数;详见ppi

ppi :Pixels Per Inch,每英寸像素数;数值越大显示越细腻。计算式:ppi = 屏幕对角线像素数 / 屏幕对角线长度。

还是举全面屏的例子,分辨率2160*1080,屏幕大小是5.9inches,勾股定理可以得到对角线像素数大约是2415,那么ppi = 2415 / 5.99 = 403.

事实上dpi 和 ppi 一定程度上可以划等号,都表示像素密度,计算方式完全一致,只不过使用场景不一样。dpi中的dots点属于打印或印刷等领域,例如drawable 文件对应的就是dpi,而ppi中的pixel属于屏幕显示等领域

dp/dip : Density-independent Pixels,密度无关像素 - 基于屏幕物理密度的抽象单位。1dp等于 160 dpi 屏幕上的dpx,这是 系统为“中”密度屏幕假设的基线密度。在运行时,系统 根据使用中屏幕的实际密度按需要以透明方式处理 dp 单位的任何缩放 。dp 单位转换为屏幕像素很简单:px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等于 1.5 物理像素。在定义应用的 UI 时应始终使用 dp 单位 ,以确保在不同密度的屏幕上正常显示 UI。

如果看完文章还是觉得很懵,那么可以直接记住: 1dp单位在设备屏幕上总是等于1/160 inch。

sp :Scale-independent Pixels ,与 dp 单位相似,也会根据用户的字体大小偏好进行缩放。

首先我们放上源码中对尺寸单位的转换

可以看到,输入值类型为dp时,返回 value * DisplayMetrics.density,到这里我们可能会发懵:嗯?不对啊,前面我们不是通过px 和 dp 的换算公式来计算的么,怎么这里就简简单单乘了一个DisplayMetrics.density?不要慌,我们先看看源码中对DisplayMetrics.density的介绍。

源码注释中说到“在160dpi的屏幕下,density的值为1,而在120dpi的屏幕下,density的值为0.75”,我们可以大胆的猜测一下,120dpi下的density=0.75的原因是120dpi * 1 /160dpi=0.75。实际上,也就是这么回事。我们下面会仔细的分析。

需要补充一下,通常意义上Android 屏幕的密度,指的是像素密度dpi/ppi,对应于源码中的DisplayMetrics.densityDpi。

为什么引入dp?

Android 引入了dp这一单位,使得不论多大屏幕,多大dpi,显示的效果始终保持一致。

但是根据前面我们提到的px与dp的换算公式px = dp * (dpi / 160),很显然,由于相同分辨率但不同屏幕大小的设备dpi是不同的,导致px和dp的基本不存在一个固定的换算关系,为了方便屏幕适配,Android设置了6个通用的密度,换算px与dp时采取通用密度计算,而非设备实际的密度。

以下为6种通用密度,以及其最小的分辨率

得到上面通用密度之后,我们换算dp与px多了一种简便方式。前面我们提到Android将mdpi作为基准,此时1px = 1dp,又有px = dp * (dpi / 160),所以我们可以很容易的得到以下换算:

还记不记得前面源码中的density属性,实际上DisplayMetrics.density = dpi / 160 ,表示的就是在某个通用密度下dp与px的换算比(1dp/1px的值)

这部分其实和程序员自身已经关系不大了,毕竟参与工作之后这些都是UI人员的活儿了。不过鉴于现在我还只是一枚在校生,还是记下来以免自己遗漏吧。

建议在xhdpi中作图

原因嘛,首先现在主流分辨率是1080p,以及最近流行起来的全面屏18:9,而xhdpi对应720p,向低dpi兼容自然没问题,即便在xxhdpi中显示,也会有个不错的效果。而如果以1920*1080作图,显然图片素材占用的内存很大,而且也会增大应用安装包的大小。

只有一个原则:资源放入对应dpi的文件夹中,Android会机智的加载合适的资源。

以drawable资源为例:

我们平时开发小项目&对UI要求不高时,只使用一套xhdpi的资源就足够了,虽然这可能会导致在hdpi及以下的手机中有些卡顿,因为xhdpi的图片运行在hdpi及以下的手机上会比较吃内存,不过无伤大雅。

而如果不为图片资源犯愁时(有UI人员的支持,就是任性),就可以添加所有dpi的资源。当然,重点还是要满足ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12的规律。

好像说了不少废话,哈哈,大概就这么多吧。




湘东区18721993067: EditText 设置android:ellipsize="end",当字符超过EditText的长度时,怎么尾部不显示省略号呢?
储影维铁: 那是因为edittext 你往里面输入的时候有ellipsize="end"属性就不可能出现需要显示省略号的过长现象, 你试试将android:hint中的文字设置长一些,看看他显示省略不,或者set一个非常长的字符串

湘东区18721993067: 怎样在android中添加按钮并设置大小 -
储影维铁: 可通过在布局文件中添加Button标签,通过android:layout_width,android:layout_height属性来设置大小;也可以通过在java代码中直接创建 Button button = new Button(context); 通过setWidth、setHeight方法设置大小,然后通过调用父控件的addView方法添加进视图中.

湘东区18721993067: android关于list的操作
储影维铁: 要是我的话我就在Adapter里做监听. 对勾的监听里把电话号码与姓名取出来,然后做相应的操作. 垃圾桶的监听里把这条记录删除,然后调用Adapter的notifyAdapter让列表做刷新操作.

湘东区18721993067: Android是基于Linux内核的,那么Linux与Android到底是什么关系? -
储影维铁: linux内核,表示..它是基于linux的...表明,linux的很多东西,android是支持的...但是 没有说,linux是基于android的,所以,表明...电脑上,不能用android程序...这个内核呢,简而言之就是,一个,负责调用你这个手机or电脑的所有硬件的一个软件,通过这个内核,就可以对硬件任意操作 然后,其他的呢,就是些用户界面,让你去对这些东西操作 see?

湘东区18721993067: Android关于字符串长度的处理问题.. -
储影维铁: 笨一点的办法就是先判断size是不是小于15,小于的话就用个for循环,少几个就补几个

湘东区18721993067: 在android中以下选项不能表示合法的颜色值的是:()a.#aaa b.#bbbb c.#ccccc d.#dddddd -
储影维铁: c不能表示合法的颜色值,Android中表示颜色的方式有四种:#ARGB #AARRGGBB #RGB #RRGGBB, A代表alpha 颜色的透明度,例:#1234 其实和#11223344是一样的颜色值,同理:#123和#112233也是一样的颜色值

湘东区18721993067: 在android xml 布局文件中 android:ems="10" 什么意思,谢谢!!! -
储影维铁: android:ems = "10" 设置TextView或者Edittext的宽度为10个字符的宽度.当设置该属性后,控件显示的长度就为10个字符的长度,...

湘东区18721993067: 关于android中handle的问题 -
储影维铁: Handler不会阻塞主线程是指你在子线程运行任务,Handler等待消息时不会阻塞主线程,但是你的代码中,你根本没有新建一个线程,run方法是直接跑在主线程里的.

湘东区18721993067: 关于androidmanifest.xml文件 以下描述错误的选项有哪些 -
储影维铁: 你的stylies.xml中没有此style吧,自己加上试试 <!-- Variant of {@link #Theme} with no title bar --><style name="Theme.NoTitleBar"><item name="android:windowNoTitle">true</item></style>

湘东区18721993067: view 在android中是什么意思 -
储影维铁: 视图,凡事能被用户看到的小控件都是一种view,也可以自定义view

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网