android单位px
1. Android-屏幕适配全攻略(绝对详细)(一)
关键字: 屏幕适配 px dp dpi sp large限定符 .9.png
前言: 这篇文章依然是我在 [慕课网 ][h]学习 凯子哥 的同名视频 Android-屏幕适配全攻略 ,所记录下来的笔记---凯子哥讲得真的超详细。
[h]: http://www.imooc.com/ "MOOC"
从上图可以看出,主流的分辨率是前六种:1280×720、1920×1080、800×480、854×480、960×540、1184×720,不过我们有解决方案。看完这篇文章,想必你就可以解决常见的屏幕适配问题。
接下来正式进入正题。
介绍几个在Android屏幕适配上非常重要的名词:
屏幕尺寸 是指屏幕对角线的长度。单位是英寸,1英寸=2.54厘米
屏幕分辨率 是指在横纵向上的像素点数,单位是px,1px=1像素点,一般是纵向像素横向像素,如1280×720
屏幕像素密度 是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写,像素密度和屏幕尺寸和屏幕分辨率有关
dip: Density Independent Pixels(密度无关像素)的缩写。以 160dpi 为基准,1dp=1px
dp: 同 dip
dpi: 屏幕像素密度的单位,“dot per inch”的缩写
px: 像素,物理上的绝对单位
sp: Scale-Independent Pixels的缩写,可以根据文字大小首选项自动进行缩放。Google推荐我们使用12sp以上的大小,通常可以使用12sp,14sp,18sp,22sp,最好不要使用奇数和小数。
用于区分不同的像素密度。
在Google官方开发文档中,说明了 ** mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi=2:3:4:6:8 ** 的尺寸比例进行缩放。例如,一个图标的大小为48×48dp,表示在mdpi上,实际大小为48×48px,在hdpi像素密度上,实际尺寸为mdpi上的1.5倍,即72×72px,以此类推。
我们可以通过以下几种方式来支持各种屏幕尺寸:
wrap_content: 根据控件的内容设置控件的尺寸
math_parent: 根据父控件的尺寸大小设置控件的尺寸
weight: 权重,在线性布局中可以使用weight属性设置控件所占的比例
例如,我们要实现下图所显示的效果:当屏幕尺寸改变时,new reader控件两边的控件大小不变,new reader控件会占完剩余的空间。
具体布局文件如下:
小插曲: 关于 android:layout_weight 属性
一般情况,我们都是设置要进行比例分配的方向的宽度为0dp,然后再用权重进行分配。如下:
效果为:
效果为:
button1宽度=L+(L-2L)×1/3=2/3L
button2宽度=L+(L-2L)×2/3=1/3L
当然,还有其他的方式,都可以运用此公式进行计算。
在实际开发中,我们一般使用0dp的方式,而不使用其他方式。
简单的布局一般都使用 线性布局 ,而略微复杂点的布局,我们使用 相对布局 ,大多数时候,我们都是使用这两种布局的嵌套。
我们使用 相对布局 的原因是, 相对布局 能在各种尺寸的屏幕上保持控件间的相对位置。
res/layout/main.xml 单面板:
res/layout-large/main.xml 双面板:
如果这个程序运行在屏幕尺寸大于7inch的设备上,系统就会加载 res/layout-large/main.xml 而不是 res/layout/main.xml ,在小于7inch的设备上就会加载 res/layout/main.xml 。
需要注意的是,这种通过 large 限定符分辨屏幕尺寸的方法,适用于android3.2之前。在android3.2之后,为了更精确地分辨屏幕尺寸大小,Google推出了最小宽度限定符。
res/layout-sw600dp/main.xml ,双面板布局: Small Width 最小宽度
这种方式是不区分屏幕方向的。这种最小宽度限定符适用于android3.2之后,所以如果要适配android全部的版本,就要使用 large 限定符和 sw600dp 文件同时存在于项目 res 目录下。
这就要求我们维护两个相同功能的文件。为了避免繁琐操作,我们就要使用布局别名。
由于后两个文具文件一样,我们可以用以下两个文件代替上面三个布局文件:
res/layout/main.xml 单面板布局
res/layout/main_twopanes.xml 双面板布局
然后在 res 下建立
res/values/layout.xml 、
res/values-large/layout.xml 、
res/values-sw600dp/layout.xml 三个文件。
默认布局
res/values/layout.xml :
Android3.2之前的平板布局
res/values-large/layout.xml :
Android3.2之后的平板布局
res/values-sw600dp/layout.xml :
这样就有了 main 为别名的布局。
在activity中 setContentView(R.layout.main);
这样,程序在运行时,就会检测手机的屏幕大小,如果是平板设备就会加载 res/layout/main_twopanes.xml ,如果是手机设备,就会加载 res/layout/main.xml 。我们就解决了只使用一个布局文件来适配android3.2前后的所有平板设备。
如果我们要求给横屏、竖屏显示的布局不一样。就可以使用 屏幕方向限定符 来实现。
例如,要在平板上实现横竖屏显示不用的布局,可以用以下方式实现。
res/values-sw600dp-land/layouts.xml :横屏
res/values-sw600dp-port/layouts.xml :竖屏
自动拉伸位图,即android下特有的 .9.png 图片格式。
当我们需要使图片在拉伸后还能保持一定的显示效果,比如,不能使图片中的重要像素拉伸,不能使内容区域受到拉伸的影响,我们就可以使用 .9.png 图来实现。
要使用 .9.png ,必须先得创建 .9.png 图片,androidSDK给我们提供了的工具就包含 .9.png 文件的创建和修改工具。双击 SDK安装目录 oolsdraw9patch.bat ,就会打开下图所示的窗口。
下面是一个例子:
Button属性设置:
如果我们选择的内容区域偏差太大,可能就不会显示出text值 BUTTON 。
好了,这篇文章写的有点多了,剩下的内容放在 下篇文章 记录吧。
内容提要:
解决方案-支持各种屏幕密度
解决方案-实施自适应用户界面流程
未完待续
2. Android像素单位dp,sp,px,pt的区别和比较
dp = dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
由此,根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看
TextView
的源码可知 Android 默认使用 sp 作为字号单位。
在 Android 中, 1pt 大概等于 2.22sp
以上供参考,如果 UI 能够以 sp 为单位提供设计是最好的,如果设计中没有 sp
的概念,则开发人员也可以通过适当的换算取近似值。
过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素 等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。
与分辨率无关的度量单位可以解决这一问题。Android支持下列所有单位。
px(像素):屏幕上的点。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为文字大小的单位,将dip作为其他元素的单位。当然,也可以考虑使用矢量图形,而不是用位图
3. Android中常见的单位ppi,dp,dpi,sp,px
在android 开发过程中,我们使用的单位比较少,一般情况下在描述字体大小的时候我们通常用sp,而在设置间距的时候我们用dp,除此之外很少再用到其他单位,而且很多时候我们用着用着就习惯了,也不去探究为什么这么写,可不可以用其他单位,每个单位到底代表着什么意思,所以说,习惯真的很可怕呀。今天,我们就来一探究竟,看看这些单位背后的含义。
像素即是屏幕上显示数据的最基本的点,在PS里面也是其最根本的单位,所有的图形都是在此基础上生成的,平时我们经常讲的手机屏幕分辨率就是以像素作为单位的,比如在android中我们经常说的手机像素是1080X1920,其实它所表达的意思是在该手机上面在横向上面有1080个像素点,在纵向上有1920个像素点。
在android中用来形式字体大小的单位,正常情况下会按照手机系统设置的文本大小来显示文字,但是同时也会与系统设置的文本保持一致,比如在有些老年机上面为了更好的操作手机有些人会将字体设置为较大字体,这个时候使用sp作为单位的字体也会随之变大,但是如果将字体大小的单位设置为dp,则不会随着系统字体的变化而变化。
在每次的手机厂商新品发布会上,我们都会听到关于手机的介绍,比如手机的屏幕分辨率,多大尺寸等等。而当我们知晓一个手机的屏幕分辩率和手机尺寸的时候,就可以计算出手机的物理像素密度,其计算公式为:
需要注意的是,PPI是Android手机物理像素密度,而非在Android开发过程中我们经常说到的像素密度。
屏幕密度与dpi密切相关,dpi是每英寸的点数。也就是说,密度越大,每英寸内容纳的点数就越多。
在android.util包下有个DisplayMetrics类可以获得密度相关的信息。最重要的是densityDpi这个成员,它有如下几个常用值:
DENSITY_LOW = 120
DENSITY_MEDIUM = 160 //默认值
DENSITY_TV = 213 //TV专用
DENSITY_HIGH = 240
DENSITY_XHIGH = 320
DENSITY_400 = 400
DENSITY_XXHIGH = 480
DENSITY_XXXHIGH = 640
dpi的值主要是通过displayMetrics获取的,获取方式为:
val densityDpi = resources.displayMetrics.densityDpi。
dp和dip是一样的,设备独立像素,这个和设备硬件有关,不同设备有不同的显示效果。而通常在做android项目的时候,为了适配市场上面众多的手机屏幕分辩率,我们一般都会采用dp。dp是Android基于物理设备的PPI抽象出来的一个单位。它是以160dpi的屏幕为基准定义的,在160dpi的屏幕上1dp=1px,那么由此我们就可以得出其计算公式:
换算公式:1dp = (屏幕ppi/160)px或者是px = (屏幕ppi/160)*1dp。举个例子:假设ppi = 320,那么1dp = 2px。
下面我们来演练一下:
如图所示,手机的屏幕分辩率为1080X1920,尺寸为5寸,从而计算得出PPI的值为440,再通过PPI计算出1dp 约等于3px。假设现在美工给的图上面有一个a图标,距离顶部的距离为30px,那么根据最终我们的换算结果可知,我们设置为10dp就可以达到完美的显示效果。
4. 探究安卓px/dp/dip/dpi/ppi/sp/density含义
dp=(160/ 像素密度值)px
so, xhdpi时,dp=1/2px;xxhdpi时,dp=1/3px;
ldpi QVGA (240×320)
mdpi HVGA (320×480)
hdpi WVGA (480×800), FWVGA (480×854)
xhdpi 720P(1280 720)
xxhdpi 1080p(1920 1080 )
xxxhdpi 4K(3840×2160)
px : pixels(像素)
ppi : pixels per inch(像素密度,所表示的是每英寸所拥有的像素数量)
dpi : dots per inch(每英寸的点数)
dp、dip : device independent pixels(设备独立像素)
sp : scaled pixels(放大像素)
density:安卓系统中的density表示的是密度系数。计算方法是density = dpi / 160。即将160dpi作为标准的密度值(每英寸点数),我们设置的dp值即是在160的标准密度值下的像素数;所以px = density * dp。
PPI和DPI的含义区别?
PPI:pixels per inch(像素密度,所表示的是每英寸所拥有的像素数量)
为什么分辨率一样,屏幕尺寸一样, 同样的dp值显示出来的实际像素值不一样?
答:PPI是固定计算的,和分辨率,屏幕尺寸相关。DPI是ROM厂商设定的,不是确定公式计算的。同样的分辨率和屏幕尺寸,只能得到PPI一致。但是这不是实际显示的结果,设置dp值是按照DPI来计算的,这个时候需要看设备实际的DPI值,DPI不同结果不同。厂商可能为了显示效果而设置了不同的density(DPI).
5. Android的px,dp和sp等单位的区别详解
px:
即像素,1px代表屏幕上一个物理的像素点;
px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小可能不同
dp:
这个是最常用但也最难理解的尺寸单位。它与“像素密度”密切相关,所以首先我们解释一下什么是像素密度。假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),160dpi就是这部手机的像素密度,像素密度的单位dpi是Dots Per Inch的缩写,即每英寸像素数量。横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。
不同的手机/平板可能具有不同的像素密度,例如同为4寸手机,有480x320分辨率的也有800x480分辨率的,前者的像素密度就比较低。
Android系统定义了四种像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。
例如界面上有一个长度为“100dp”的图片,那么它在240dpi的手机上实际显示为80x1.5=120px,在320dpi的手机上实际显示为80x2=160px。如果你拿这两部手机放在一起对比,会发现这个图片的物理尺寸“差不多”,这就是使用dp作为单位的效果。
dip:
与dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,后来为了与sp统一就建议使用dp这个名字了。
sp:
与缩放无关的抽象像素(Scale-independent Pixel)。sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。
还有几个比较少用到的尺寸单位:
mm:
即毫米;
in:
即英寸,1英寸=2.54厘米(约);
pt:
1pt=1/72英寸=0.035厘米;
最佳实践,文字的尺寸一律用sp单位,非文字的尺寸一律使用dp单位。例如textSize="16sp"、layout_width="60dp";偶尔需要使用px单位,例如需要在屏幕上画一条细的分隔线时:
<View layout_width="match_parent" layout_height="1px"/>
补充:
1. android.view.ViewGroup.LayoutParams.height及width这两个属性的单位为像素,但是为了兼容多种分辨率的手机,我们需要最好使用dp。
2. 根据手机的分辨率从dp的单位转成px
public static int dip2px(Context context, float dpValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(dpValue*scale + 0.5f);
}
3.根据手机的分辨率从px转成dp
public static int px2dip(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(pxValue/scale + 0.5f);
}
6. 一篇文章帮你理清pt,px, ppi,dpi,dp,sp
作为一个新人,在做移动端UI设计的时候,往往对px,pt,ppi,dpi,dp,sp不是十分清楚,一倍图二倍图三倍图如何换算,导致切图时不知如何导出,本人在学习过程中整理汇总了一些相关知识,并尽量用最简单得语言解释。设计师在设计时可以进行参考。(如发现文中出现错误,请联系我更正)。
名词解释 :
点pt : point,印刷行业常用单位,等于1/72英寸
像素px :pixel,电子屏幕上影像成像的基本单位。
长度单位 dp: dip ,Density-independent pixel, 是安卓开发用的长度单位,1dp表示在屏幕像素点密度为160ppi时1px长度
字体大小sp : scale-independent pixel,安卓开发用的字体大小单位。
点密度dpi : dot per inch,每英寸多少点,值越高图片越细腻。属于谷歌旗下第一款Android设备为160dpi,规定一倍图为160dpi。
像素密度ppi :pixel per inch,每英寸像素数,值越高屏幕越细腻。
面积相等的区域里,塞进了多少个像素,就代表像素密度有多大,塞进的像素越多即像素密度越大,肉眼所见细腻。如图1个方块代表1个像素,同一个区域里,100X100px的区域塞进去像素更多,显示时也会更清晰细腻。
计算公式及关系:
px与pt:1pt= (DPI / 72) px
即ps中,当画布分辨率为72时,pt=1px; 当新建画布分辨率为72*2=144ppi时,1pt=2px
dpi与ppi:安卓1倍图(163dpi)=ios1倍图(160ppi),dpi=ppi
注意:当ppi计算出来>=300,肉眼就已经分辨不出其区别。
以iphone3GS(320*480px/3.5 inch)为例 , 为ios1倍图
接下来,我将用部分主流机型举例:由 得,
iPhone 8 (750*1334px/4.7inch) 326 163*2 为2倍图
iPhone xr (828*1792px/6.1inch) 319 163*2 为2倍图
iPhone xs (1125*2346/5.8inch) 462 163*3 为3倍图
用这个公式,就可以大致判断每个机型应该是几倍图。其他就不在详细计算了,以1倍的mdpi为基准,像素密度更高或者更低的设备,只需乘以相应的倍率,就能得到与基准倍率相近的显示效果。上图:
px和dp: 1dp=(屏幕ppi/ 160)px,即1dp定义为屏幕密度值为160ppi时的1px
以WVGA屏为例,该屏幕为480px*800px,按3.8寸屏算,点密度 √ (480^2 + 800^2) / 3.8 = 245,约等于240,对应于hdpi屏幕,所以该屏幕1dp=1.5px。安卓端屏幕大小各不相同,根据其像素密度,分为以下几种规格:
1dp定义为屏幕密度值为160ppi时的1px,即在mdpi时,1dp = 1px。 以mdpi为标准,这些屏幕的密度值比为:ldpi : mdpi : hdpi : xhdpi : xxhdpi = 0.75 : 1 : 1.5 : 2 : 3;即,在xhdpi的密度下,1dp=2px;在hdpi情况下,1dp=1.5px。其他类推。
dp和sp:都是安卓的开发单位,dp是长度单位,sp是字体单位,可根据用户字体大小进行缩放,一般认为1dp=1sp。
Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等,当文字尺寸是“正常”时1sp=1dp,而当文字尺寸是“大”或“超大”时,1sp>1dp。
总结:
1. 在画布分辨率=72ppi时,1pt=1px
2.ppi=dpi,计算公式(√ (屏幕横向像素点x^2 + 屏幕纵向像素点y^2)/屏幕尺寸inch)
3. 1dp=(屏幕ppi/ 160)px
4.1dp=1sp
7. Android中dip,dp,sp,pt和px的区别
dip和dp是一样的
dip/dp(与密度无关的像素):逻辑长度单位,在 160 dpi 屏幕上,1dp=1px=1/160英寸。随着密度变化,对应的像素数量也变化,但并没有直接的变化比例。
sp(与密度和字体缩放度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
pt(Points ,磅):屏幕物理长度单位, 表示一个点,是屏幕的物理尺寸。大小为1英寸的1/72。
px(Pixels ,像素):对应屏幕上的实际像素点。例如,320*480的屏幕在横向有320个象素,在纵向有480个象素。
另外还有两个未提到的是in和mm
in(Inches ,英寸):屏幕物理长度单位。每英寸等于2.54厘米。例如,形容手机屏幕大小,经常说,3.2(英)寸、3.5(英)寸、4(英)寸就是指这个单位。这些尺寸是屏幕的对角线长度。如果手机的屏幕是3.2英寸,表示手机的屏幕(可视区域)对角线长度是3.2*2.54 = 8.128厘米。读者可以去量一量自己的手机屏幕,看和实际的尺寸是否一致。
mm(Millimeters ,毫米):屏幕物理长度单位