android屏幕相关知识

参考1:

android 度量单位 dp sp px DPI 屏幕尺寸 分辨率 像素密度

术语和概念
  • 屏幕尺寸 Screen size
即显示屏幕的实际大小,按照屏幕的对角线进行测量,(比如 2.8寸, 3.5寸)。为简单起见,Android把所有的屏幕大小分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, extra large). 应用程序可以为这四种尺寸分别提供不同的自定义屏幕布局-平台将根据屏幕实际尺寸选择对应布局进行渲染,这种选择对于程序侧是透明的。 系统会负责把你的布局方案以合适的方式渲染到对应的屏幕上,这个过程是不需要程序员用代码来干预的。
  • 屏幕长宽比 Aspect ratio
长宽比是屏幕的物理宽度与物理高度的比例关系。应用程序可以通过使用限定的资源来为指定的长宽比提供屏幕布局资源。只需要用系统提供的资源分类符long和 notlong。
  • 分辨率 Resolution
在屏幕上显示的物理像素总和。例如 320*480。需要注意的是:尽管分辨率通常用宽x高表示,但分辨率并不意味着具体的屏幕长宽比。在Andorid系统中,应用程序不直接使用分辨率。 
  • 密度  Density
在单位屏幕面积上能显示的像素数量。在同样的宽高区域,低密度的显示屏能显示的像素较少,而高密度的显示屏则能显示更多的像素。屏幕密度非常重要,因为其它条件不变的情况下,一个宽高固定(这里宽高应是指的像素)的UI组件(比如一个按钮)在在低密度的显示屏上显得很大, 而在高密度显示屏上看起来就很小。为简单起见,Android把所有的屏幕分辨率也分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large). 应用程序可以为这四种尺寸分别提供不同的资源,平台将透明的对资源进行缩放以适配指定的屏幕分辨率。
  • 密度无关的像素(DIP)通设备独立像素Density-independent pixel (dp)
应用程序可以用来定义UI组件的虚拟像素单元,通过密度无关的方式来描述布局尺寸和位置。 一个设备独立像素相当于一个160 dpi屏幕上的物理像素。 在程序运行时,系统根据屏幕的实际密度透明的处理任何需要缩放的设备独立像素单元,设备独立像素转换成屏幕实际像素的换算很简单:pixels = dps * (density / 160). 
例如在240 dpi的屏幕上,1个设备独立像素等于1.5物理像素.为确保UI组件在不同的屏幕都能合适的展示,强烈建议使用设备独立像素单元来定义你的应用程序UI。 
四种屏幕尺寸分类:: small, normal, large, and xlarge 
四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high) 
需要注意的是: xhdpi是从  Android   2.2 (API Level 8)才开始增加的分类. 
xlarge是从Android 2.3 (API Level 9)才开始增加的分类. 一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。
强烈推荐你用 DIP来定义你程序的界面布局,因为这样可以保证你的 UI在各种分辨率的屏幕上都可以正常显示。 
  • DPI是“dot per inch”的缩写,每英寸像素数。

两种获取屏幕分辨率信息的方法:
DisplayMetrics metrics = new DisplayMetrics();
Display display = activity.getWindowManager().getDefaultDisplay();
display.getMetrics(metrics);
//这里得到的像素值是设备独立像素dp
//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 这样获得的参数信息不正确,不要使用这种方式。
不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。这个得到的宽和高是空的。

如果需要为Android pad定制资源文件,则res目录下的目录可能为:
drawable
drawable-ldpi
drawable-mdpi
drawable-hdpi
drawable-xhdpi
drawable-nodpi
drawable-nodpi-1024×600
drawable-nodpi-1280×800
drawable-nodpi-800×480
values
values-ldpi
values-mdpi
values-hdpi
values-xhdpi
values-nodpi
values-nodpi-1024×600
values-nodpi-1280×800
values-nodpi-800×480


private void initResolutionStr(Context context) {

        if (ApiConfig.getResolutionStr() == null || ApiConfig.getResolutionStr().equals("")) {

            WindowManager winMgr = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);

            Display display = winMgr.getDefaultDisplay();

            int height = display.getHeight();

            int width = display.getWidth();

            String resolution = height > width ? height + "x" + width : width + "x" + height;

            ApiConfig.setResolutionStr(resolution);

            // densityDpi = 120dpi is ldpi, densityDpi = 160dpi is mdpi,

            // densityDpi = 240dpi is hdpi, densityDpi = 320dpi is xhdpi

            DisplayMetrics dm = new DisplayMetrics();

            getWindowManager().getDefaultDisplay().getMetrics(dm);

            int densityDpi = dm.densityDpi;

            ApiConfig.setDensityDpi(densityDpi);

        }

    }
   
复 制代码如果需要为Android pad定制资源文件,则res目录下的目录可能为:drawabledrawable-ldpidrawable-mdpidrawable- hdpidrawable-xhdpidrawable-nodpidrawable-nodpi-1024×600drawable-nodpi- 1280×800drawable-nodpi-800×480valuesvalues-ldpivalues-mdpivalues- hdpivalues-xhdpivalues-nodpivalues-nodpi-1024×600values-nodpi- 1280×800values-nodpi-800×480Android上常见度量单位:
  px(像素):屏幕上的点,绝对长度,与硬件相关。
  in(英寸):长度单位。
  mm(毫米):长度单位。
  pt(磅):1/72英寸,point。
  dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
  dip:Density-independent pixel,同dp相同。
  sp:在dp的基础上,还与比例无关,个人理解为是一个矢量图形单位。引入dp/dip的原因:
   过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素 等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。与分辨率无关的度量单位可以解决这一问题。

  • 如何计算密度
1.标准是240*320画在1.5*2平方inch上。那么像每平方英寸有240*320/(1.5*2)=25600点,也就是一平方英寸的像素点为25600,所以dpi取为它的平方根160;如果你的dpi是120,那么它的密度就是0.75.
2.密度不只是与width有关,还与height有关,所以不管width是1.8还是 1.3,它的密度都有可能是1;比如width是1.8,只要它 的height是3/1.8的话,如果pixel为240*320的话,它的密度仍旧是1;同样如果width为1.3,只要它的 height为3/1.3的话,像素点为240*320,则密度也是1.
3.320*480/(1.5*2)得到单位平方英寸的点为51200,所以单位平方英寸是240*320画在1.5*2屏幕的2倍。但是这是平方英寸啊,算密度的时候要开平方的啊,所以应该是2开平方,是1.414吧,大致密度为1.5。
  • 如何做到与密度无关:
  如果屏幕密度为160,这时dp和sp和px是一样的。1dp=1sp=1px,但如 果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏 幕密度变成了320。那么原来TextView的宽度设成160px,在密度为320的3.2 寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动将width属性值设置成320px的。 也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换。官方文档总结的计算公式为:pixels = dps * (density /160).

引用自:http://www.android100.org/html/201304/26/2327.html

------------------------

参考2:

android控件常用属性和单位

android 布局方式 像素单位
dp:即dip,与sp 基本类似。如果需要设置长度、高度等属性时可以使用dp 或sp。
sp:如果设置字体,需要使用sp。
px:表示屏幕实际的象素。例如,320*480 的屏幕在横向有320个象素,在纵向有480 个象素。
dp、sp、px区别:dp 是与密度无关,sp 除了与密度无关外,还与比例 无关。如果屏幕密度为160,这时dp 和sp 和px 是一样的。1dp=1sp=1px,但如果使用px 作单位,如果屏幕大小不变(假设还是3.2 寸),而屏幕密度变成了320。那么原来TextView 的宽度设成160px,在密度为320 的3.2 寸屏幕里看要比在密度为160 的3.2 寸屏幕上看短了一半。但如果设置成160dp 或160sp 的话。系统会自动将width 属性值设置成320px 的。也就是160 * 320 / 160。其中320 / 160 可称为密度比例因子。也就是说,如果使用dp 和sp,系统会根据屏幕密度的变化自动进行转换。
in:表示英寸,是屏幕的物理尺寸。每英寸等于2.54 厘米。例如,形容手机屏幕大小,经常说,3.2(英)寸、3.5(英)寸、4(英)寸就是指这个单位。这些尺寸是屏幕的对角线长度。如果手机的屏幕是3.2 英寸,表示手机的屏幕(可视区域)对角线长度是3.2*2.54 = 8.128 厘米。读者可以去量一量自己的手机屏幕,看和实际的尺寸是否一致。
mm:表示毫米,是屏幕的物理尺寸。
pt:表示一个点,是屏幕的物理尺寸。大小为1 英寸的1/72。

像素:(建议用dp)
q px(像素):屏幕上的点。
q in(英寸):长度单位。
q mm(毫米):长度单位。
q pt(磅):1/72英寸。
q dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
q dip:与dp相同,多用于Google示例中。
q sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
density :值表示每英寸有多少个显示点,与分辨率是两个概念。
WQVGA屏density=120;
QVGA屏density=120;
HVGA屏density=160;
WVGA屏density=240;
当屏幕density=240时使用hdpi标签的资源
当屏幕density=160时,使用mdpi标签的资源
当屏幕density=120时,使用ldpi标签的资源。
px 与 dp的换算
pixs =dips * (densityDpi/160).
dips=(pixs*160)/densityDpi

布局方式:
q Linearlayout(线性布局)默认布局方式
q TableLayout?(表格布局)
q Relative Layout(相对布局)–推荐使用 相对布局比起前面两种布局方法而言更随意,用户可以将控件放在自己所希望的任何位置。
q AbsoluteLayout(绝对布局)–不推荐使用,因为android的屏幕分化太严重了,除非是针对某一款硬件专业使用,或者有针对各种屏幕写对应的配置文件

在LinearLayout和TableLayout中常见的指令有

android:id——控件指定相应ID
android:text——控件中显示文字。注意尽量使用Strings.xml
android:gravity——控件中文字基本位置,如center、left、right、center_horizontal等。
android:textsize——控件中字体大小,单位为pt。
android:background——控件背景色
android:width——控件宽度
android:height——控件高度
android:padding——空间内边距,指控件当中内容到空间的距离。其中有android:padding_left、android:padding_right等。
android:siglelise——如果设置为真,控件内容将在同一行显示。
android:margin——外边距。
相对布局Relative Layout
大体分为下面三类
第一类:属性值为true或false
android:layout_centerHrizontal 是否至于水平方向中央
android:layout_centerVertical 是否至于垂直方向中央
android:layout_centerInparent 至于父控件水平/垂直方向中央
android:layout_alignParentBottom 是否与父控件下边对齐
android:layout_alignParentLeft 是否与父控件的左边对齐
android:layout_alignParentRight 是否与父控件的右边对齐
android:layout_alignParentTop 是否与父控件的上边对齐
android:layout_alignWithParentIfMissing
第二类:属性值必须为id的引用名“@id/id-name”
android:layout_below 在某某上面
android:layout_above 在某某下面
android:layout_toLeftOf 将控件左边缘至于给定控件的右边
android:layout_toRightOf 将控件右边缘至于给定控件的左边
android:layout_alignTop 将控件的顶部与给定控件顶部对奇
第三类:属性值为具体的像素值,如30dip,40px
android:layout_marginBottom 与下边的距离
android:layout_marginLeft 与左边的距离
android:layout_marginRight 与右边的距离
android:layout_marginTop 与上边的距离

引用自:http://www.imyukin.com/?p=205

---------------------------------

参考3:

Android开发:dp,px深入解析

dip: device independent pixels(设备独立像素)

dip介绍: 与密度无关的像素,这是一个基于屏幕物理密度的抽象单位。密度可以理解为每英寸包含的像素个数(单位是dpi),1dp实际上相当于密度为160dpi的屏上的一个点(可否理解为物理尺寸?)。也就是说,如果屏幕物理密度是160dpi时,dp和px是等效的。 为何而生: 因为手机屏幕大小不同,为保证各种屏幕上显示效果的兼容性,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。 举例说明: 一块拥有320480分辨率的手机屏幕,如果宽度是2英寸,高度是3英寸,这块屏幕的密度就是160dpi。 一块拥有480800分辨率的手机屏幕,如果宽度是2英寸,高度是3英寸,这块屏幕的密度就不是160dpi了。这时屏幕的物理密度就变大了(大于160dpi)。这就意味着屏幕每英寸可以显示更多的像素点,屏幕的显示效果就更细腻了。 假设一个按钮的宽度使用dp作为单位,在160dpi时设为160,而在更高的dpi下(如320dpi),按钮的宽度看上去和160dpi时的屏幕一样。这是由于系统在发现屏幕的密度不是160dpi时,会计算一个转换比例,然后用这个比例与实际尺寸相乘就得出新的尺寸。计算比例的方法是目标屏幕的密度除以160.如果目标屏幕的密度是320dpi,那么这个比例就是2。如果按钮的宽度是160dp,那么在320dpi的屏幕上的宽度就是320个像素点(dp是抽象单位,在实际的屏幕上应转换成像素点)。从这一点可以看出,dp可以自适应屏幕的密度。不管屏幕密度怎样变化,只要屏幕的物理尺寸不变,实际显示的尺寸就不会变化。如果将按钮的宽度设成160px,那么在320dpi的屏幕上仍然会是160个像素点,看上去按钮的宽度只是160dpi屏幕的一半。 Android官方建议弃置表示宽度,高度,位置等属性时应尽量使用dp作为尺寸单位   公式:px = dip * density / 160,则当屏幕密度为160时,px = dip。 根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知Android默认使用sp作为字号单位。将dip作为其他元素的单位。   

备注: 根据google的推荐,像素统一使用dip,字体统一使用sp    
举个例子区别px和dip:px就是像素,如果用px,就会用实际像素画,比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。 而dip,比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度(当屏幕尺寸不变时)。 public static int dip2px(Context context, float dipValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale + 0.5f); } public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } 以下内容转自:http://blog.csdn.net/eggcalm/article/details/7006378 今天偶然间问了同事一个关于dp单位的问题,然后由这个问题引发的一连串的问题彻底颠覆了我关于dp的理论体系。 我那个问题是这样的:既然dp的本质是物理尺寸,为什么不用cm或者mm等传统长度单位替代? 然后他回答我dp是和像素密度无关的。。。我对这个回答不屑一顾,不过他接下来的一句话把我彻底震惊了,那句话是这样的:在你的手机上320dp就刚好满屏了,310dp就差一点点满屏。 我的手机是HTC Desire,这个理论我闻所未闻,然后马上做了个小实验,事实确实是这样,把一个TextView背景设成红色,宽度设成320dp,能看到满屏,310dp就差那么一点点。 看到这个测试结果的时候,我再一次崩溃了,我希望同事第二句话是一个美丽的错误,我无法接受这么久以来我理解的东西是错误的,可是事实是残酷的。 Android Developers关于dp的文档我看过N次,那个px和dp的转换公式我记得很清楚: px = dp * (dpi / 160),可是今天翻了源码了才发现,原来这里的dpi是归一化后的dpi,可能值只有120(low)、160(medium)、240(high)、 320(xhigh)四种,而我之前理解的竟然是实际设备真实的dpi! G7的真实dpi是252,根据我以前的理解,310dp换算成px应该是:310 * (252 / 160) = 488像素,而G7水平方向是480px,310dp在这上面绝对满屏都不止了,事实上Android系统并没有拿252作为dpi来计算,而是将G7视 作hdpi设备,然后使用240dpi来计算最终像素,所以在G7上320dp刚好是:320 * (240 / 160) = 480像素,刚好满屏了,310dp确实要差一点点。 搞清楚这个问题后,我心里稍微好受点了,可是另一个问题接踵而来: dp的本质还是物理尺寸,难道不是吗?尽管Android系统对待dp这事上,将所有设备视为四种:120(low)、160(medium)、 240(high)、320(xhigh),在160dpi上,160dp就是1英寸,在240dpi上,160dp还是1英寸,120dpi和 320dpi也还是1英寸,虽然他们占用的像素数不一样,但是最终显示出来的效果都是占用了屏幕上1英寸的范围。这套体系其实是非常合理的,一个宽为 160dp的按钮,它在所有设备上占用的物理尺寸应该是一样大才合理,这样他们对人眼所形成的张角才一样大,观看或者阅读的感觉才一致(姑且不考虑按钮的 背景是否一样细致)。这应该是Android系统引入dp概念的原因,因为手机屏幕的像素密度相差实在太大了,web那套东西已经完全不适用,你想电脑屏 幕的像素密度能相差多大? 终极问题来了,现实生活中真的只有以上四种不同像素密度的设备吗?不可能。虽然所有这些设备都可以粗略地划分为low、medium、high、 xhigh四种密度,可是对于划在同一范围内但具有不同像素密度的两个设备来说,同样的dp最终所占用的物理尺寸是不一样的。举个例子,G7(HTC Desire)的屏幕尺寸是3.7英寸,分辨率是480800,像素密度是252dpi,G10(HTC Desire HD)的屏幕尺寸是4.3英寸,分辨率同为480800,像素密度是217dpi。假设现在有一个按钮,它的宽度设为100dp,由于G7和G10同被 划分为hdpi,那么在这两个设备上,这个按钮的实际宽度是:100 * (240 / 160) = 150像素,可由于这两个设备的实际像素密度是不一样的,所以真实的显示效果是:这个按钮在两个设备上的实际物理尺寸是不一样大的。而这,和 Android进入dp的概念是相悖的。 你可以说对于同属于hdpi的设备而言,这个差别很小,但是在ldpi和hdpi之间这个差别就很明显了。我非常认同,可是如果在将dp转化为px的时 候,不是使用归一化dpi(也就是120(low)、160(medium)、240(high)、320(xhigh)这四种),而是使用设备真实的像 素密度,那么得出的像素数目虽然各不一样,但是最终显示出来的物理尺寸确实一样大的,而这种计算方法,我认为是忠于像素密度无关的理论的。 最后我还是想说,如果Android希望一个宽度为160dp的按钮在任何设备上都是1英寸大,那为什么不直接使用英寸作为度量单位呢?如果你有好的想法,欢迎留言。 UPDATE: 今天下午在回答factar网友的问题的时候,我上面那个“终极问题”终于找到了一个合理的答案。在factar贴的网址里,我发现一句重要的话: “However, bitmap scaling can result in blurry or pixelated bitmaps, which you might notice in the above screenshots.” 这句话的意思是说,图片资源在缩放的时候会造成图像模糊。按照我以上的分析,如果为了保证相同的图片资源在不同像素密度的设备上保持完全一样的尺寸 大小(这完全可以做到,在dp转化成px的时候使用设备的物理像素密度参数),那图片在不同设备上的缩放因子必然不一样,而这会导致图像模糊!所以我猜想 Google为了保证了图像不会模糊退了一步,让相同dp在不同设备上“差不多一样大”。 还有,这个答案也纠正了我的一个误区,现在有很多应用程序开发商为了降低安装包的大小,只使用一套hdpi资源或者一套xhdpi资源,而不提供 mdpi资源或ldpi资源,希望在mdpi和ldpi设备上有系统完成缩放适应,虽然可行,但是我们不应忽视因为缩放带来的图像模糊、显示效果不佳的现象。 网友问答参考: 不知eggclam现在是否对dp有了更深入的理解,我现在对dp这里也陷入到了这步,我现在有三个pad,一个10寸,2个7寸, 参数如下: A:7寸pad 1, denstiy:1.0 分辨率 1024X600 B: 7寸pad 2, denstiy: 1.33 分辨率 1280X800 C: 7寸pad 3, denstiy:1.0 分辨率 1280X800 按照google 官方文档称(http://developer.android.com/guide/practices/screens_support.html) Density independence 段落,用dp在不同的denstiy 下,大小看起来应该是一样的。 我在三个pad 都设置了同样dp长度的按钮,但是在3个pad上的长度看着都不一样,不知道是因为什么呢?能不能加你好友讨论下呢? 引用“factar”的评论:不知eggclam现在是否对dp有了更深入的理解,我现在对dp这里也陷入到了这步,我现在有三个pad… C 设备应该是10寸吧? 如果C 设备是10寸,那么这三款设备的物理dpi大致如下: A:169.5 B:215.6 C:150.9 根据这里的划分(http://developer.android.com/guide/practices/screens_support.html#range),A和C被评价为mdpi(density=1.0),B本来应该被评价为hdpi(density=1.5),但是自从API LEVEL 13开始Android引入了DENSITY_TV(dpi=213),而且你贴的数据也的确证明这一点,所以B设备的density沿用你的数据1.33 接下来我们算算一根50dp的线条在这三个设备上显示成多少像素: A:50 * 1.0 = 50(px) B:50 * 1.33 = 67(px) C:50 * 1.0 = 50(px) 接下来的问题就简单了,问题直接转化成这三个像素值在ABC上占用的物理尺寸一致吗?我们可以算算: A:50 / 169.5 = 0.2950(英寸) = 0.7493(厘米) B:67 / 215.6 = 0.3108(英寸) = 0.7894(厘米) C:50 / 150.9 = 0.3313(英寸) = 0.8418(厘米) 根据以上结果,你看到的不完全一样大是合乎情理的,因为在Android中,相同dp在所有mdpi设备上虽然像素数量是一样的,但是因为各个设备物理dpi不一样,所以在最终的显示尺寸上是有微弱差别的onlinechen,本内容来自腾讯内部分享,请勿外传!

引用自:http://my.oschina.net/onlinechen/blog/165444

-------------------------------------

参考4:

http://blog.csdn.net/mowen1111/article/details/9055723

http://blog.csdn.net/yanbin1079415046/article/details/7879314

http://blog.csdn.net/yihui823/article/details/6734341

http://blog.csdn.net/vincent_blog/article/details/8547851

http://blog.csdn.net/u010483428/article/details/9667337


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值