Android上常见度量单位【xdpi、hdpi、mdpi、ldpi】解读

术语和概念 
屏幕尺寸 
屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如 2.8寸, 3.5寸)。 
简而言之, Android把所有的屏幕尺寸简化为三大类:大,正常,和小。 
程序可以针对这三种尺寸的屏幕提供三种不同的布局方案,然后系统会负责把你的布局方案以合适的方式渲染到对应的屏幕上,这个过程是不需要程序员用代码来干预的。
屏幕长宽比 
屏幕的物理长度与物理宽度的比例。程序可以为制定长宽比的屏幕提供制定的素材,只需要用系统提供的资源分类符long和 notlong。
分辨率 
屏幕上拥有的像素的总数。注意,虽然大部分情况下分辨率都被表示为“宽度×长度”,但分辨率并不意味着屏幕长宽比。在 Android系统中,程序一般并不直接处理分辨率。
密度 
以屏幕分辨率为基础,沿屏幕长宽方向排列的像素。 
密度较低的屏幕,在长和宽方向都只有比较少的像素,而高密度的屏幕通常则会有很多 ——甚至会非常非常多——像素排列在同一区域。屏幕的密度是非常重要的,举个例子,长宽以像素为单位定义的界面元素(比如一个按钮),在低密度的屏幕上会 显得很大,但在高密度的屏幕上则会显得很小。
密度无关的像素( DIP ) 
指一个抽象意义上的像素,程序用它来定义界面元素。它作为一个与实际密度无关的单位,帮助程序员构建一个布局方案(界面元素的宽度,高度,位置)。 
一个与密度无关的像素,在逻辑尺寸上,与一个位于像素密度为 160DPI的屏幕上的像素是一致的,这也是Android平台所假定的默认显示设备。在运行的时候,平台会以目标屏幕的密度作为基准,“透明地”处理所 有需要的DIP缩放操作。要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式: pixels = dips * (density / 160)。举个例子,在 DPI为 240的屏幕上, 1个 DIP等于 1.5个物理像素。我们强烈推荐你用 DIP来定义你程序的界面布局,因为这样可以保证你的 UI在各种分辨率的屏幕上都可以正常显示。
为了简化程序员面在对各种分辨率时的困扰,也为了具备各种分辨率的平台都可以直接运行这些程序, Android平台将所有的屏幕以密度和分辨率为分类方式,各自分成了三类: 
·三种主要的尺寸:大,正常,小; 
·三种不同的密度:高( hdpi),中( mdpi)和低( ldpi)。 【DPI是“dot per inch”的缩写,每英寸像素数。】
如果需要的话,程序可以为各种尺寸的屏幕提供不同的资源(主要是布局),也可以为 各种密度的屏幕提供不同的资源(主要是位图)。除此以外,程序不需要针对屏幕的尺寸或者密度作出任何额外的处理。在执行的时候,平台会根据屏幕本身的尺寸 与密度特性,自动载入对应的资源,并把它们从逻辑像素( DIP,用于定义界面布局)转换成屏幕上的物理像素。


首先是几个基本概念:

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。

参考: 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()。这个得到的宽和高是空的。


如果需要为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

  1. private void initResolutionStr(Context context) {
  2.         if (ApiConfig.getResolutionStr() == null || ApiConfig.getResolutionStr().equals("")) {
  3.             WindowManager winMgr = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
  4.             Display display = winMgr.getDefaultDisplay();
  5.             int height = display.getHeight();
  6.             int width = display.getWidth();
  7.             String resolution = height > width ? height + "x" + width : width + "x" + height;
  8.             ApiConfig.setResolutionStr(resolution);
  9.             // densityDpi = 120dpi is ldpi, densityDpi = 160dpi is mdpi,
  10.             // densityDpi = 240dpi is hdpi, densityDpi = 320dpi is xhdpi
  11.             DisplayMetrics dm = new DisplayMetrics();
  12.             getWindowManager().getDefaultDisplay().getMetrics(dm);
  13.             int densityDpi = dm.densityDpi;
  14.             ApiConfig.setDensityDpi(densityDpi);
  15.         }
  16.     }
复制代码
如果需要为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).


附:
        传说iPhone/Mac的设计从一开始就考虑到对任意分辨率的支持,iOS的所有介面元素用的都已经是矢量化了的图片,UI界面是系统级别的与密度无关;而Android虽然支持任意分辨率,但不是系统全局的,求证。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. AccountsTester(账户测试) 1.1 Select Account Type(选择账户类型) 1.2 Get By Type(通过类型获得) 1.3 Get All(显示全部) 1.4 Add(增加用户) 1.4.1 可以简单的几个步骤配置一个交换用户(email地址和密码) 1.5 Properties(属性) 1.6 features(特征) 1.7 authtoken type(用户标志类型) 2.Bad Behavior(屏蔽垃圾发布器) 2.1 Crash the main app thread(破坏主要的应用程序线程) 2.2 Crash an auxiliary app thread(破坏一个辅助应用程序线程) 2.3 Crash the native process(破坏本地进程) 2.4 Crash the system server(破坏系统服务器) 2.5 Report a WTF condition(????) 2.6 ANR(Application Not Responding)(Stop responding for 20 seconds)——(应用无响应)(停止反应20s) 2.7 ANR starting an Activity(运行一个活动,但是应用无相应) 2.8 ANR recriving a broadcast Intent(接收一个广播意图,但是应用无响应) 2.9 ANR staring a Service(运行一个服务,但是应用无响应) 2.10 System ANR(in ActivityManager(系统无响应)(在行为控制器上) 2.11 Wedge system(5 minutes system ANR)(楔板系统)(5分钟系统无响应) 3.configuration(配置) configuration 3.1 fontScale=1.0(缩放比例=1.0) 3.2 hardKeyboardHidden=2(隐藏硬件键盘=2) 3.3 keyboard=2(键盘=2) 3.4 locale=en_US(现场环境=英文) 3.5 mcc=310(电机控制中心=310???)(MOTOR CONTROL CENTER) 3.6 mnc=260(位技术控=260)(Microcomputer Numberical Control) 3.7 navigation=3(导航=3) 3.8 navigationHidden=1(隐藏导航=1) 3.9 orientation=1(定位=1) 3.10 screenLayout=0x22(屏幕格式=0x22) 3.11 touchscreen=3(触摸屏=3) 3.12 uiMode=0x11(用户界面模式=0x11) DisplayMetrics(不显示的属性) 3.13 density=1.5(密度=1.5) 3.14 densityDpi=240(密度分辨率=240) 3.15 heightPixels=800(高度像素=800) 3.16 scaledDensity=1.5(尺度密度=1.5) 3.17 widthPixels=480(宽度分辨率=480) 3.18 xdpi=240.0(x轴分辨率=240.0) 3.19 ydpi=240.0(y轴分辨率=240.0) 4.Connectivity(连接工具) 4.1 Enable Wifi(启动Wifi) 4.2 Disable Wifi(关闭Wifi) 4.3 Start Wifi Toggle(启动Wifi开关) 4.4 Stop Wifi Toggle(关闭Wifi开关) 4.5 Wifi on(ms)(Wifi开启多长时间) 4.6 Wifi off(ms)(Wifi关闭多长时间) 4.7 Cycles done:1(周期做一次) 4.7.1 Start Screen Toggle(启动屏幕开关) 4.7.2 Stop Screen Toggle(关闭屏幕开关) 4.7.3 Wifi on(ms)(Wifi开启多长时间) 4.7.4 Wifi off(ms)(Wifi关闭多长时间) 4.8 Cycles done:0(周期做0次) 4.8.1 Start MMS(开启彩信) 4.8.2 Stop MMS(关闭彩信) 4.8.3 Start HiPri(开启导航) 4.8.4 Stop HiPri(关闭导航) 5.Development Settings(开发设置) 5.1 Debug App(调试程序) Android 键盘/Android 系统/API Domes/Certificate Installer(证书安装)/com.android.gestuer.builder()/com.android.sdksetup()/Custom Locale()/Dev Tools(开发工具)/Example Wallpapers(墙纸式样)/HTML查看器/Live Wallpaper Picker(动态壁纸选取)/NetSpeed(网速)/OpenWnn(一种输入法)/Pico TTS(语音程序)/Sample Soft Keyboard(样品软键盘)/sdk2.3/Spare Parts(备件)/Speech Recorder(演讲录音机)/Status Bar(状态栏)/Terminal Emulator(终端模拟器)/TTS Service(TTS服务)/User Dictionary(用户词典)/拨号器/拨号器存储/打包安装程序/发送电子邮件/谷歌拼音输入法/后备/计算器/联系人存储/浏览器/录音机/媒体存放/启动器/软件包访问帮助程序/设置/设置存储/时钟/受DRM保护的内容的存储/搜索/搜索应用程序提供商/通讯录/下载管理器/下载内容/相机/信息/虚拟专用网服务/音乐/账户与同步设置/住屏幕提示 5.2 Wait for debugger(等待调试程序) 5.3 pointer location(触点位置) 5.4 show running processes(显示运行的程序) 5.5 show screen updates(显示屏幕更新) 5.6 Disable compatibility mode(禁用兼容性模式) 5.7 app process limit(应用程序限制) 5.8 immediately destroy activities(立即毁坏项目) 5.9 show cpu usage(显示CPU的进程) 5.10 show sleep state on LED(再LED上显示睡眠时间) 5.11 window animation scale 1x(窗口动画规模1X) 5.12 transition animation scale 1x(转换动画模式1X) 5.13 Light Hinting(轻显示) 5.14 show gtalk service connetion status(显示即时通讯连接标志) 6.goole login service(谷歌登录服务) 7.Instrumentation(仪表) 7.1 local sample(本地例子) 8. Media Scanner(媒体扫描仪) 9. Package Browser(包浏览器) 目录参照5.1 例如:Android键盘 Package Summary(包装总结) a. com.android.inputmethod.latin(来源网站) d. Restart(重启) b. (No Application Class)(无应用类型) c. (NO Label)(无标签) e. system(系统) f. process(程序) com.android.inputmethod.latin g. User ID(用户帐号) 10016 h. Task Affinity(任务类同) "com.android.inputmethod.latin" i. Version(版本) 2.3.1(#9) j. Source(资源) /system/app/LatinIME.apk k. Data(数据) /data/data/com.android.inputmethod.latin l. Activities(活动) LatinIMESettings/LatinIMEDebugSettings/InputLanguageSelection 例如:LatinIMESettings“android键盘设置” Multiple(normal):倍数(正常的) Process(程序) com.android.inputmethod.latin Task Affinity(任务类同) com.android.inputmethod.latin Required Permission(许可要求) (none) Multiprocess(多处理器) No Clear on Background(在背景中清理) No State Not Needed(国家不需要) No m. Services(服务) LatinIME(android键盘) 10. Pointer Location(触点的坐标位置) P:0(左键松开)/0(没有触点屏幕);X和Y(复位值):绝对值的dx为横向的绝对长度,正号代表从左向右触摸,负号正好相反。dy的绝对值代表纵向的绝对长度,正号代表从上往下触摸,负号正好相反;Xv和Yv:表示红线的横向和纵向相对长度,正负号的意思和X和Y一样;Prs:是否有点击屏幕;Size:线的尺寸(只显示一种) 11.Running processes(正在运行的程序) 例如:system process Information(程序信息) Process Name:(程序的名字) system(系统) package in process:(在程序中的包文件) android com.android.providers.settings 12. Sync Tester(同步测试) 12.1 Registered Sync Adapters:(注册同步适配器) 12.2 选择网站 12.3 bind(捆绑):点击显示:a.已经连接到同步适配器.b.连接资源地址:。。。c.账户类型:。。。 unbind(不捆绑);start sync(开始同步) cancel sync(取消同步)。 13. Terminal Emulator(终端模拟器)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值