Android hdpi、nodpi、sw600dp-xhdpi、sw720dp-xhdpi、xhdpi

节选自:http://www.miui.com/thread-1348880-1-1.htmlhtml


es文件夹的一些文件夹为何要分出一些分支?例如drawable分出drawable-hdpi?

    缘由很简单,你们要明白Android是一个分裂很严重的系统。每一个设备的屏幕大小和分辨率都不太同样,因此要有一些适配工做。若是不作适配,受到屏幕密度的影响,在一台手机上工做正常的APP装到另一个手机上很容易会界面错位。drawable等分支文件夹就是为了适配而生的,系统会自动判断分辨率等信息,而后到对应的文件夹找图片,这样高分辨率上有高分辨率的大图,低分辨率上有低分辨率的小图,就不容易发生一些图标大小不匹配的现象了。

屏幕密度?

    屏幕密度是根据像素分辨率,在屏幕指定物理宽高范围内能显示的像素数量。
    在一样的屏幕尺寸条件下,一张图片在密度低的屏幕上会显得大,在密度高的屏幕上会显得小。
    例以下面一张图,咱们在两个密度不同的屏幕上显示一个点,结果密度低的点要大,密度高的点要小。
     1.png 

hdpi、nodpi、sw600dp-xhdpi、sw720dp-xhdpi、xhdpi是啥

    先要知道dpi什么意思。dpi=“dot per inch”的缩写,是每英寸像素数的意思,其实就是上面说到的屏幕密度。

    其中,有这些dpi:ldpi (l = low,低)、mdpi (m = medium,中)、 hdpi (h = high,高)、 and xhdpi (xh = extra high ,极高)。
    通常状况下的普通屏幕DPI:ldpi120,mdpi160,hdpi240,xhdpi320。

    其中dpi能够经过这么一个公式计算出来:√(长^2+宽^2)/屏幕尺寸,也就是长的2次方与宽的2次方的和再开方而后除以屏幕尺寸。
    因而咱们能够计算出米2的dpi是√(1280^2+720^2)/4.3≈341。属于xhdpi。
     2.png 

    至于nodpi是没有dpi么?其实这里存放着通用的图像,存放在nodpi的这些图像,在每一个分辨率上都不会伸缩放大,这样每一个手机上的图片像素大小都同样大。

    那么sw600dp是什么意思?sw就是“Screen Width”(屏幕宽度)的缩写,这样,屏幕像素宽度大于等于600dp的手机就会使用这里面的资源。

    dp又是啥?dp是设备独立像素(Density-independent pixel),是一个应用程序能够用来定义UI组件的虚拟像素单元,它使得布局统一化,这样,不须要考虑屏幕密度也能描述出UI组件的位置了。

land和port是啥?

    land是用于横屏状态下的文件,port是用于竖屏状态下的文件。

zh-rCN、zh-rTW是啥?

    zh-rCN=简体中文(CN表明中国大陆)、zh-rTW=繁体中文(TW表明港澳台地区)。

    按照这些规则,咱们理解文件夹名就不难了,例如"values-sw600dp-land"存放的是“屏幕宽度大于等于600dp且在横屏模式下的字串符文件android



术语和概念 
屏幕尺寸 
屏幕的物理尺寸,以屏幕的对角线长度做为依据(好比 2.8寸, 3.5寸)。 
简而言之, Android把全部的屏幕尺寸简化为三大类:大,正常,和小。 
程序能够针对这三种尺寸的屏幕提供三种不一样的布局方案,而后系统会负责把你的布局方案以合适的方式渲染到对应的屏幕上,这个过程是不须要程序员用代码来干预的。程序员

屏幕长宽比 
屏幕的物理长度与物理宽度的比例。程序能够为制定长宽比的屏幕提供制定的素材,只须要用系统提供的资源分类符long和 notlong。布局

分辨率 
屏幕上拥有的像素的总数。注意,虽然大部分状况下分辨率都被表示为“宽度×长度”,但分辨率并不意味着屏幕长宽比。在 Android系统中,程序通常并不直接处理分辨率。post

密度 
以屏幕分辨率为基础,沿屏幕长宽方向排列的像素。 
密度较低的屏幕,在长和宽方向都只有比较少的像素,而高密度的屏幕一般则会有不少 ——甚至会很是很是多——像素排列在同一区域。屏幕的密度是很是重要的,举个例子,长宽以像素为单位定义的界面元素(好比一个按钮),在低密度的屏幕上会 显得很大,但在高密度的屏幕上则会显得很小。ui

密度无关的像素( DIP ) 
指一个抽象意义上的像素,程序用它来定义界面元素。它做为一个与实际密度无关的单位,帮助程序员构建一个布局方案(界面元素的宽度,高度,位置)。 
一个与密度无关的像素,在逻辑尺寸上,与一个位于像素密度为 160DPI的屏幕上的像素是一致的,这也是Android平台所假定的默认显示设备。在运行的时候,平台会以目标屏幕的密度做为基准,“透明地”处理所 有须要的DIP缩放操做。要把密度无关像素转换为屏幕像素,能够用这样一个简单的公式: pixels = dips * (density / 160)。举个例子,在 DPI为 240的屏幕上, 1个 DIP等于 1.5个物理像素。咱们强烈推荐你用 DIP来定义你程序的界面布局,由于这样能够保证你的 UI在各类分辨率的屏幕上均可以正常显示。url

为了简化程序员面在对各类分辨率时的困扰,也为了具有各类分辨率的平台均可以直接运行这些程序, Android平台将全部的屏幕以密度和分辨率为分类方式,各自分红了三类: 
·三种主要的尺寸:大,正常,小; 
·三种不一样的密度:高( hdpi),中( mdpi)和低( ldpi)。 
【DPI是“dot per inch”的缩写,每英寸像素数。】
若是须要的话,程序能够为各类尺寸的屏幕提供不一样的资源(主要是布局),也能够为 各类密度的屏幕提供不一样的资源(主要是位图)。除此之外,程序不须要针对屏幕的尺寸或者密度做出任何额外的处理。在执行的时候,平台会根据屏幕自己的尺寸 与密度特性,自动载入对应的资源,并把它们从逻辑像素( DIP,用于定义界面布局)转换成屏幕上的物理像素。spa

 

转自 http://www.cnblogs.com/cmduan/archive/2012/03/09/2388345.html设计

首先是几个基本概念:3d

1.屏幕尺寸Screen size

即显示屏幕的实际大小,按照屏幕的对角线进行测量。

为简单起见,Android把全部的屏幕大小分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).

应用程序能够为这四种尺寸分别提供不一样的自定义屏幕布局-平台将根据屏幕实际尺寸选择对应布局进行渲染,这种选择对于程序侧是透明的。

2.屏幕长宽比Aspect ratio

长宽比是屏幕的物理宽度与物理高度的比例关系。应用程序能够经过使用限定的资源来为指定的长宽比提供屏幕布局资源。

3.屏幕分辨率Resolution

在屏幕上显示的物理像素总和。须要注意的是:尽管分辨率一般用宽x高表示,但分辨率并不意味着具体的屏幕长宽比。

在Andorid系统中,应用程序不直接使用分辨率。

4.密度Density

根据像素分辨率,在屏幕指定物理宽高范围内能显示的像素数量。

在一样的宽高区域,低密度的显示屏能显示的像素较少,而高密度的显示屏则能显示更多的像素。

屏幕密度很是重要,由于其它条件不变的状况下,一共宽高固定的UI组件(好比一个按钮)在在低密度的显示屏上显得很大, 而在高密度显示屏上看起来就很小。

为简单起见,Android把全部的屏幕分辨率也分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).

应用程序能够为这四种尺寸分别提供不一样的资源-平台将透明的对资源进行缩放以适配指定的屏幕分辨率。

5.设备独立像素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)才开始增长的分类.

DPI是“dot per inch”的缩写,每英寸像素数。

通常状况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。

参考:http://developer.android.com/images/screens_support/screens-ranges.png

两种获取屏幕分辨率信息的方法:

DisplayMetrics metrics = new DisplayMetrics();

Display display = activity.getWindowManager().getDefaultDisplay();

display.getMetrics(metrics);

//这里获得的像素值是设备独立像素dp

//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 这样得到的参数信息不正确,不要使用这种方式。

不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。这个获得的宽和高是空的。

复制代码
    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目录下的目录可能为:

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

Android上常见度量单位:
  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)更高的新显示器上运行该程序,则用户界面会显得很小。在有些状况下,用户界面可能会小到难以看清 内容。与分辨率无关的度量单位能够解决这一问题。

如何计算密度(请参照原帖:http://www.devdiv.com/thread-28610-1-1.html);
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).


附:         传说iPhone/Mac的设计从一开始就考虑到对任意分辨率的支持,iOS的全部介面元素用的都已是矢量化了的图片,UI界面是系统级别的与密度无关;而Android虽然支持任意分辨率,但不是系统全局的,求证。