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).


你可能感兴趣的:(android 度量单位 dp sp px DPI)