一,Android 各种标尺单位的含义:

px:表示屏幕实际的象素。例如,320*480的屏幕在横向有320个象素,在纵向有480个象素。
pt:表示一个点,是屏幕的物理尺寸。大小为1英寸的1/72。
in:表示英寸,是屏幕的物理尺寸。每英寸等于2.54厘米。例如,形容手机屏幕大小,经常说,3.2(英)寸、3.5(英)寸、4(英)寸就是指这个单位。这些尺寸是屏幕的对角线长度。如果手机的屏幕是3.2英寸,表示手机的屏幕(可视区域)对角线长度是3.2*2.54 = 8.128厘米。读者可以去量一量自己的手机屏幕,看和实际的尺寸是否一致。
mm:表示毫米,是屏幕的物理尺寸。

常见的有 px(pixel) 与 pt(point) 两种。

二,Android 中dp与sp标尺单位的由来及计算方法:

由于Google对Android的开放政策,使得所有厂商都可以加入到智能手机的研发中来。于是乎,Android手机一时间百花齐放,出现了各种不同的手机样式。
240*320 320*240 320*480 480*800 480*854 640*960 720*1280,……
屏幕物理尺寸3.2、3.5、3.75、4.0、4.3、5.0、7、9.3、10.1

为了更好的描述这种多样化引发的问题,我们需要引入一个新的概念density,也就是密度。它指的是在一定尺寸的物理屏幕上显示像素的数量,一般使用dpi(dots per inch,每英寸像素数)作为单位。比如一台分辨率为240x320,屏幕物理尺寸为1.5英寸x2英寸的手机,他的密度可以用分辨率/尺寸,240/1.5或者320/2,密度为160dpi。对于用户来说,密度越大的屏幕显示效果越精细,因为每英寸显示的像素数量更多。
如果是要使用px和pt给程序贴图,假设生成了一条240px的直线,在240*320的屏幕上刚好可以铺满,而放到480x800的分辨率下才刚刚到一半的位置。
如果要解决这样的问题,那么程序在实现的时候就必须为每个分辨率都写一个配置,否则就会出现图形在低密度的屏幕上显示的更大,而在高密度的屏幕上显示的更小。最麻烦的事情在于,一旦出现新的分辨率,所有程序都没办法直接运行了。这明显不符合手机快速发展的客观规律。
为了解决这个问题,Google为Android引入了一套新的单位dp和sp。

首先登场的是dp,Density Independent Pixel,可以翻译为密度无关像素。和px相比,dp在不同密度的屏幕中实际显示比例将保持一致。根据规定,一个dp相当于160dpi屏幕中的一个px。在320dpi的屏幕中,一个dp相当于2个px。通过这样的成比例放缩,Android解决了需要多个不同屏幕中的大小显示问题。
具体而言,当屏幕的的分辨率为320x480时,无论实际的物理尺寸大小,密度都会被设置为160dpi,也就意味着这个设备上,一行最多可以放置320dp,而对于480x800的设备,只需屏幕尺寸在3寸到4.3寸之间,密度都会被设置为240dpi,一行同样可以放置320dp。
因此在开发中,用dp作为单位,只需要设置一次,就可以适配到多个屏幕上。

同样,sp,scaled pixels,这个单位也采用了和dp同样的设计理念,将需要独立设置的pt转化为可以自动适配的sp,从而解决了文字的优化显示。

三,具体的 dpi(dot per inch每英寸像素数) 计算方法:

譬如1280x720物理分辨率,5英寸大小的屏幕,其dpi 的计算方法是:sqrt(1280*1280+720*720)/5 = 293.72 dpi

四,px 与 dp 的转换方法:

譬如1280x720物理分辨率,5英寸大小的屏幕上,<dimen name="indicator_bar_width_large">54dp</dimen>
这个高度如何转换成 px 呢,计算方法是:54dp*293.72/160+0.5f = 99.6305px,约为 100px。

那么我们就可以给这个长度去让UI工程师提供切图了。

import android.content.Context;  
public class DensityUtil {  
  
    /** 
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 
     */  
    public static int dip2px(Context context, float dpValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (dpValue * scale + 0.5f);  
    }  
  
    /** 
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 
     */  
    public static int px2dip(Context context, float pxValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (pxValue / scale + 0.5f);  
    }  


五,屏幕像素密度 dpi 分类:

譬如1280x720物理分辨率,5英寸大小的屏幕 需要对应哪一种界面布局或者图片资源呢?
图片资源有 drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi,drawable-xxhdpi,drawable-xxxhdpi(2K屏)等等
界面布局:layout-small,layout-normal,layout-mdpi,layout-hdpi,layout-xhdpi, 甚至还可以有 layout-480x854 这种特殊尺寸的布局
ldpi:low-dpi 低像素密度
mdpi:middle-dpi 中像素密度
hdpi:high-dpi 高像素密度
xhpi:extreame high-dpi 超高像素密度

可以查看下图:



那么根据上面算出来的 293.72dpi 可以算为 xhdpi 超高像素密度了。

六,编程建议(如何做到自适应屏幕大小):

1, 需要根据物理尺寸的大小准备多套布局,layout(放一些通用布局xml文件,比如界面中顶部和底部的布局,不会随着屏幕大小变化,类似windos窗口的title bar),layout-small(屏幕尺寸小于3英寸左右的布局),layout-normal(屏幕尺寸小于4.5英寸左右),layout-hdpi(4英寸-7英寸之间),layout-xhdpi(7-10英寸之间)

2, 需要根据dpi值准备5套图片资源,drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi
  Android有个自动匹配机制去选择对应的布局和图片资源
    
3, 在XML布局,使用wrap_content和fill_parent来填充整个父窗口;
4, 使用FrameLayout的,而不是AbsoluteLayout,减少界面布局对屏幕大小的依赖;
5, 使用dp 来代替 px 作为图片长度单位;文字用 sp 代替 px 来作为字号大小;
6, 根据density 和 resolution 为不同的设备准备合适的图片资源,见上面第五条。



参考文献:

【1】dp和px,那些不得不吐槽的故事——Android平台图片文字元素单位浅析  http://blog.sina.com.cn/s/blog_6499f8f101014ipq.html
【2】Android手机分辨率基础知识(DPI,DIP计算) http://blog.csdn.net/moruite/article/details/6028547
【3】Android中dp和px之间进行转换  http://blog.csdn.net/arui319/article/details/6777133
【4】Android中的长度单位详解(dp、sp、px、in、pt、mm)http://blog.csdn.net/nokiaguy/article/details/5509638
【5】Android屏幕密度(Density)和分辨率的解释 http://www.apkbus.com/android-15796-1-1.html

Android 系统当中各种尺寸单位的定义及使用的更多相关文章

  1. android中常用的尺寸单位及其关系

    1 尺寸单位定义 px(pixel,像素):每个px对应屏幕上的一个点 dip或dp(device independent pixels,设备独立像素):一种基于屏幕密度的抽象单位.在每英寸160个点 ...

  2. 【Android学习】尺寸单位 px in mm pt dp sp

    一.Android中支持的尺寸单位 下面用表格的方式将Android中支持的尺寸单位列举,供大家参考: Android的尺寸单位  单位表示  单位名称  单位说明  px  像素  屏幕上的真实像素 ...

  3. Android系统编程入门系列之应用数据文件化保存

    应用中关于数据的持久化保存,不管是简单的SharedPreferences还是数据库SQLiteDatabase,本质上都是将数据保存到系统的某种类型的文件中.因此可以直接使用java.io.File ...

  4. Android屏幕尺寸单位转换

    最近在看Android群英传这本书,书中有一节涉及到了,屏幕尺寸与单位.觉得以后可能会用到,做个笔记. PPI(pixels per inch) ,又称为DPI,它是由对角线的像素点数除以屏幕的大小得 ...

  5. Android 尺寸单位转换和屏幕适配相关

    Android 尺寸单位转换和屏幕适配相关 各种尺寸单位的意义 dp: Density-independent Pixels 一个抽象的单元,基于屏幕的物理密度. (dp和dip的意义相同,所以不用区 ...

  6. Android课程---手机尺寸相关的概念 +尺寸单位+关于颜色

    手机的尺寸: 屏幕对角线的长度,单位为英寸(2.54cm) 手机的分辨率: 屏幕能显示的像素的数量, 一般用在长方向上数量*宽方向上数量来表达 手机的像素密度: pixels per inch,也称P ...

  7. Android——手机尺寸相关的概念 +尺寸单位+关于颜色

    手机的尺寸: 屏幕对角线的长度,单位为英寸(2.54cm) 手机的分辨率: 屏幕能显示的像素的数量, 一般用在长方向上数量*宽方向上数量来表达 手机的像素密度: pixels per inch,也称P ...

  8. Android系统在超级终端下必会的命令大全(adb shell命令大全)

    . 显示系统中全部Android平台: android list targets . 显示系统中全部AVD(模拟器): android list avd . 创建AVD(模拟器): android c ...

  9. android系统如何自适应屏幕大小

    1.屏幕相关概念 1.1分辨率 是指屏幕上有横竖各有多少个像素 1.2屏幕尺寸 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 android将屏幕大小分为四个级别 ...

随机推荐

  1. SPOJ 7258 Lexicographical Substring Search

    Little Daniel loves to play with strings! He always finds different ways to have fun with strings! K ...

  2. Spring 自带的定时任务Scheduled

    1.注解@Scheduled 可以作为一个触发源添加到一个方法中,例如,以下的方法将以一个固定延迟时间5秒钟调用一次执行,这个周期是以上一个调用任务的完成时间为基准,在上一个任务完成之后,5s后再次执 ...

  3. 查询优化--ORDER BY查询优化

    Mysql 系列文章主页 =============== ORDER BY 子句,尽量使用 Index 查询,避免使用 FileSort 排序 尽可能在索引列上完成排序操作,遵照索引的最佳左前缀原则 ...

  4. Tomcat的安装与配置

    Windows安装Tomcat与启动 安装版安装 安装版长这个样子,下载到电脑上后双击开始安装 双击后出现如下页面,点击 Next> 之后是这个页面,点击 I Agree 之后出现如下页面,点击 ...

  5. bootstrap插件fileinput.js 出现出现$("#xxxx").fileinput({}); 不生效的情况解决

    如果出现$("#xxxx").fileinput({}); 不生效的情况请将fileinput.js中最后几行注释掉: /* $(document).ready(function ...

  6. 360搜索引擎so自动收录php改写方案——适合phpcms等cms

    360搜索引擎自动收录功能,官方提供了代码,带式,十分坑爹,没有提供批量提交入口,只是提供了一段js代码,关键是 一个js去下载另外一个js,document.write到文档,然后再 重复2遍如此工 ...

  7. Apache 443端口占用解决方法

    当运行httpd.exe时,出现如下问题 原因是启动Apache会占用443端口,而443被其他程序占用了.我们只需将Apache默认端口443改掉就行.网上搜了一下,说是更改Apache24\con ...

  8. kafka topic 相关操作

    1.列出集群中的topic bin/kafka-topics.sh --zookeeper spark1:2181,spark2:2181,spark3:2181 --list 2.创建topic r ...

  9. c++自定义类型

    /* --自定义数据类型 结构体 共用体 共用体的数据成员在存储数据时共享存储空间,修改一个成员也会改变另一个成员的值 枚举型 如果要使变量只能使用有限的几个值,则应当使用枚举体.之所以叫枚举体,就是 ...

  10. ASP.NET实现在线浏览Word文档另一种解决方案(Word转PDF)

    ASP.NET实现在线浏览Word文档另一种解决方案(Word转PDF)      上述博文里提到的在线浏览pdf的方案不错,但word转pdf的那个dll只支持doc不支持docx,附上最新的下载链 ...