引言

对于程序在不同尺寸的Android机器上执行,对UI的适用性造成了额外的开销,只是限定符的出现,非常方便的攻克了这个问题。通过创建限定符相关的文件夹来解决资源的载入。


限定符用处

限定符(mdpi,tvdpi,hdpi)能够帮助我们推断屏幕密度

限定符(land,port)能够帮助我们区分屏幕横竖屏状态

限定符(en,fr…)能够帮助我们语言和地区

限定符(v3,v4…)能够帮助我们区分安卓版本号

限定符(1024x600…)能够适配计算虚拟键或者不计算虚拟键的屏幕

……

Android SDK Supporting Multiple Screens话题

Supporting Multiple Screens


限定符列表

特征 限定符 描写叙述
屏幕尺寸 small
normal
large
xlarge
small:这样的屏相似低分辨率的QVGA屏幕。对于小屏的最小布局尺寸大约是320x426dp。比如QVGA低分辨率和VGA高分辨率。
normal:这样的屏相似中等分辨率的HVGA屏幕。对于普通屏幕的最小布局尺寸大约是320x470dp。

如。WQVGA低分辨率屏、HVGA中等分辨率屏、WVGA高分辨率屏。
large:这样的屏相似中等分辨率的VGA屏幕。对于大屏幕的最小布局尺寸大约是480x640dp。比如VGA和WVGA的中等分辨率屏。
xlarge:这样的屏被觉得比传统的中等分辨率的HVGA屏幕大。针对xlarge屏的最小布局尺寸大约是720x960dp。

在大多数情况下,这样的超大屏幕的设备由于太大而要放到背包中来携带,而且最有可能的是平板样式的设备。
注意:使用尺寸限定符不意味着资源仅用于这个尺寸的屏幕。假设没实用限定符提供与当前设备配置相匹配的可选资源,那么系统会使用与配置最接近的资源。

警告:假设全部使用尺寸限定符的资源都比当前屏幕大,那么系统将不会使用它们。而且应用程序会在执行时崩溃(比如。假设全部的布局都被标记了xlarge限定符,而设备却是一个普通尺寸的屏幕)。
这个限定符被加入在API级别4以后的版本号中。

屏幕方向 port
land
port:纵向设备(垂直)
land:横向设备(水平)
假设用户旋转屏幕,这个限定能够在应用程序执行期间改变。
orientation配置字段指示当前设备的方向。

屏幕像素密度(dpi) ldpi
mdpi
hdpi
xhdpi
nodpi
tvdpi
ldpi:针对大约120dpi的低分辨率屏幕。
mdpi:针对大约160dpi的中等分辨率屏幕(在传统的HVGA上);
hdpi:针对大约240dpi的高分辨率屏幕;
xhdpi:针对大约320dpi的超高分辨率屏幕。被加入在API基本8以后的版本号中;
nodpi:这个限定被用于不想依据匹配的设备分辨率进行缩放的位图资源。
tvdpi:在mdpi和hdpi之间的屏幕。大约是213dpi。这样的分组不是基本的分辨率,大多数是为电视来考虑的。而且大多数应用不须要它—提供mdpi和hdpi资源就能够满足大多数应用程序须要了。而且系统会适当的缩放它们。

这个限定符在API级别13以后被引入。
四种基本的分辨率之间的缩放比例是:3:4:6:8(忽略tvdpi分辨率),因此一个9x9的ldpi位图。在mdpi中是12x12、在hdpi中是18x18、在xhdpi中是24x24。

假设感觉在电视或其它某些设备上的图片资源不好看,而且想要试用tvdpi资源。那么缩放因子是1.33*mdpi。比如,一个100px x 100px的mdpi图片的图片应该被放大成133px x 133px的tvdpi图片。
注意:使用分辨率限定符不意味着资源仅适用与相应分辨率的屏幕。

假设没有提供与当前设备配置匹配的可选资源,那么系统会使用最接近的资源。

MCC和MNC mcc310
mcc310-mnc004
mcc208-mnc00
MCC是移动国家代码的英文首字母缩写(The mobile country code)。它的后面可选择性的尾随来自设备内的SIM卡的移动网络代码(MNC:mobile network code)。如在不论什么载体上。mcc310代表美国。mcc310-mnc004代表美国的Venizon公司。mcc208-mnc00代表法国的Orange公司。
假设设备使用音频连接(GSM 电话),那么MCC和MNC的值来自SIM卡。
也能够单独使用MCC(比如,在应用程序中包括特殊国家合法的资源)。

假设仅须要指定语言环境,那么能够使用language和region限定符来替代(稍后讨论)。假设决定要使用MCC和MNC限定符。就要细致測试。使它能够满足你所期望的工作。
还能够查看配置域mcc和mnc,它们分别指示了当前的移动国家代码和移动网络代码。
mcc:http://developer.android.com/reference/android/content/res/Configuration.html#mcc
mnc:http://developer.android.com/reference/android/content/res/Configuration.html#mnc

语言和地区 en
fr
en-rUS
fr-rFR
fr-rCA
语言是用两个字母的ISO 639-1语言代码定义的。紧跟其后的是可选的两个ISO-3166-1-appha-2地区代码字母(前面是小写的“r”)。
这个编码不区分大写和小写。r前缀被用于区分地区部分,不能够单独指定地区。
假设用户改变了系统中的语言设置,那么在应用程序的执行期间也能够改变为相应的语言。
最小宽度 sw<N>dp
比如:
sw320dp
sw600dp
sw720dp
屏幕的基本尺寸,是指最短的可用屏幕区域。

详细的说。设备的最小宽度是屏幕可用的宽度和高度中最短的那个(也能够把它看做是屏幕的最小可能的宽度)。这样就能够使用这个限定符来确保应用程序至少有<N>dp的宽度可用于UI界面,而无论屏幕的当前方向。

比如,假设布局在不论什么时候都须要至少600dp的最小屏幕尺寸,那么就能够使用这个限定符,在res/layout-sw600dp/文件夹中创建布局资源。系统仅仅会在可用屏幕的尺寸至少是600dp的时候才会使用这些资源。而无论600dp是否是被用户认知的高度或宽度。最小宽度是设备的固定屏幕尺寸特征,当屏幕的方向发生改变时。设备的最小宽度不改变。
设备的最小宽度须要考虑屏幕的装饰和系统UI的占用。比如。假设设备有一些固定的UI元素要沿着最小宽度的轴向,占用一定的屏幕空间。那么系统声明的最小宽度要比实际的屏幕尺寸要小。由于被系统占用的像素部分对用户应用程序的UI无效。因此,这个值应该是应用程序布局所须要的最小的实际尺寸(通常,这个值是布局支持的最小宽度。而无论屏幕的当前方向)。
下面是能够使用的通用屏幕尺寸的一些值:
1.320。针对下面屏幕配置的设备:
240x320ldpi(QVGA手持设备)
320x480mdpi(手持设备)
480x800hdpi(高分辨率手持设备)
2.480,针对480x800mdpi的屏幕(平板或手持设备)
3.600。针对600x1024mdip的屏幕(7英寸平板)
4.720,针对720x1280mdip的屏幕(10英寸平板)
当应用程序提供了多个带有不同值的最小宽度限定符资源文件夹时。系统会使用最接近(不超出)设备最小宽度的那个资源。
这个限定符被加入在API级别13中。
还要看android:requiresSmallestWidthDp属性,它声明了与你的应用程序兼容的最小的最小宽度。而且smallestScreenWidthDp配置字段会持有这个设备最小宽度的值。

可用宽度 w<N>dp
比如:
w720dp
w1024dp
指定最小的可用屏幕宽度。在资源中应该以dp为单位来定义<N>的值。

当方向在横向和纵向之间改变时。这个配置值会跟当前的实际的宽度相匹配。
当应用程序给这个配置提供了多个不同值的资源文件夹时,系统会使用最接近(不超过)设备当前屏幕宽度的那个配置。

这个值须要考虑屏幕装饰占领的空间。因此,假设设备在显示的左边或右边有一些固定的UI元素,那么使用的宽度值就要比实际的屏幕尺寸小。由于这些固定UI元素的占用,使得应用程序的可用空间降低。

这个特性被加入在API级别13中还要看screenWidthDp配置字段。它持有当前的屏幕宽度。

可用高度 h<N>dp
比如:
h720dp
h1024dp
指定最小的可用屏幕高度,在资源中应该以dp为单位来定义的值,当方向在横向和纵向直接改变时。这个配置值应该跟当前的实际高度匹配。
当应用程序给这个配置提供了不同值的多个资源文件夹时。系统会使用最接近(不超过)设备当前屏幕高度的那个配置。

这个要考虑屏幕装饰的占用情况,因此,假设设备在显示的上方或底部有一些固定的UI元素。那么要使用的高度值要比实际的屏幕尺寸小,由于这些固定UI元素的占用,使得应用程序的可用空间降低。

不固定的屏幕装饰(如电话的状态栏能够在全屏时被隐藏)是不考虑的,像标题栏或操作栏这样的窗体装饰也不考虑,因此应用必须准备处理比它们指定的空间要小的情况。

这个限定符被加入在API级别13中。
还要看screenHeightDp配置字段。它持有当前屏幕的高度。

屏幕外观 long
notlong
long:长屏幕,如WQVGA、WVGA、FWVGA
notlong:非长屏幕,如QVGA、HVGA、VGA
这个限定符被加入在API级别4以后的版本号中
这个限定符全然是基于屏幕的外观比率。不相对屏幕的方向。

还要看screenLayout配置字段,它指示了屏幕是否是长屏。

泊位模式 car
desk
car:设备停靠在汽车中
desk:设备停靠在书桌中
这个限定符被加入在API级别8以后的版本号中,假设用户改变了设备的停靠地点,那么能够在应用程序的执行期间改变这个限定。

能够使用UiModeManager对象来启用或禁止这样的模式。

夜间模式 night
notnight
night:夜间
notnight:白天
被加入在API级别8以后的版本号中,假设夜间模式被保留在自己主动模式中(默认),那么在应用程序执行期间,会基于白天的时间来进行模式的改变。能够使用UiModeManager对象来启用或禁止这样的模式。
触屏类型 notouch
stylus
finger
notouch:非触屏设备
stylus:有适用手写笔的电阻屏设备
finger:触屏设备
touchscreen配置字段,指示到了设备上的触屏类型。
键盘可用性 keysexposed
keyshidden
keyssoft
keysexposed:设备有可用的键盘。假设设备启用了软键盘,那么即使在硬键盘没有暴露给用户时也能够使用这个限定符。假设没有提供软键盘或者软键盘被禁用,那么仅仅有在硬键盘被暴露给用户时才干够使用这个限定符。
keyshidden:设备有可用的硬键盘。可是被隐藏了。而且设备没有可用的软键盘。
keyssoft:设备有可用的软键盘,无论它是否可见。
假设提供了keysexposed资源。但没有keyssoft资源,那么仅仅要系统有可用的软键盘。系统就会使用keysexposed资源而无论键盘是否可见。
假设用户打开了硬键盘。就能够在应用程序执行期间改变这个限定。
hardKeyboardHidden和keyboardHidden配置字段分别指明硬键盘的可见性以及可见的键盘类型(包括软键盘)。
主要文本输入法 nokeys
qwerty
l2key
nokeys:设备没实用于文本输入的硬键盘;
qwerty:设备有标准的硬键盘。无论用户是否可见;
12key:设备有12个键的硬键盘,无论用户是否可见。
keyboard配置字段指明可用的主要文本输入方法。

导航键的有效性 navexposed
navhidden
navexposed:导航键对用户可用;
navhidden:导航键不可用。
假设用户能够看到导航键,那么在应用程序执行时就能够改变这个限定。
navigationHidden配置字段,指示导航键是否隐藏。

基本的非触屏导航方法 nonav
dpad
trackball
wheel
nonav:除了使用触屏以外,设备没有其它导航设施。

dpad:设备实用于导航的定向板(d-pad)。

trackball:设备实用于导航的轨迹球。

wheel:设备实用于导航的定向滚轮(不常见)。
navigation
配置字段指明可用的导航方法类型。

平台版本号(API 级别) 比如:
v3
v4
v7
设备支持的API级别。

如v1代表API级别1(带有Android1.0或更高版的设备),v4代表API级别4(带有Android1.6或更高版本号的设备)
警告:Android1.5和1.6仅仅有在限定符跟平台版本号全然匹配时。才干匹配资源


限定符演示样例

仅仅须要用横线加限定符的方式就可以使用,xx-限定符


限定符执行顺序

限定符的匹配是向下匹配。从高向低找。


博客名称:王乐平博客

博客地址:http://blog.lepingde.com

CSDN博客地址:http://blog.csdn.net/lecepin


安卓UI适配限定符的更多相关文章

  1. Android屏幕适配方案——基于最小宽度(Smallest-width)限定符

    转自:https://www.cnblogs.com/error404/p/3815739.html 一.关于布局适配建议 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_ ...

  2. Android 目前最稳定和高效的UI适配方案

    Android系统发布十多年以来,关于Android的UI的适配一直是开发环节中最重要的问题,但是我看到还是有很多小伙伴对Android适配方案不了解.刚好,近期准备对糗事百科Android客户端设计 ...

  3. android多分辨率多屏幕密度下UI适配方案

    相关概念 分辨率:整个屏幕的像素数目,为了表示方便一般用屏幕的像素宽度(水平像素数目)乘以像素高度表示,形如1280x720,反之分辨率为1280x720的屏幕,像素宽度不一定为1280 屏幕密度:表 ...

  4. Android使用最小宽度限定符时最小宽度的计算

    Android开发中最头疼的问题之一就是兼容不同尺寸和分辨率的设备.这里推荐一篇总结的比较完整的<Android开发:最全面.最易懂的Android屏幕适配解决方案>.这篇文章对屏幕兼容的 ...

  5. 背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例

    [源码下载] 背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例 作者:webabcd 介绍背水一战 Windows 10 之 资源 资源限定符概述 资源限定符示例 ...

  6. [汇编与C语言关系]5. volatile限定符

    现在研究一下编译器优化会对生成的指令产生什么影响,在此基础上介绍C语言的volatile限定符.首先看下面的C程序: /* artificial device registers */ unsigne ...

  7. .NET LINQ 限定符操作

    限定符操作      限定符运算返回一个 Boolean 值,该值指示序列中是否有一些元素满足条件或是否所有元素都满足条件. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表 ...

  8. C++const限定符

    在C语言中我们使用#define宏定义的方式来处理符号常量.而在C++中有一种更好的处理符号常量的方法,那就是使用const关键字来修改变量声明和初始化.这种处理常量方式的好处不言而喻:如果程序在多处 ...

  9. const 限定符

    1.定义const对象 const限定符把一个对象转换成一个常量 const int Bufsize = 512; 定义Bufsize 为常量并初始化为512.变量Bufsize仍然是一个左值,但是不 ...

随机推荐

  1. 【转】[译]深入理解JVM

    http://www.cnblogs.com/enjiex/p/5079338.html 深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/un ...

  2. Js 希望某链接只能点击一次

    <a onclick=”function(){...}”> 希望这连接只能执行一次 <a onclick=”function(){...}; this.onclick()=funct ...

  3. map/set/object/array对比

    map () { //数据结构横向对比, 增,查,改,删 let map = new Map() let array = [] //增 map.set('t',1) array.push({t:1}) ...

  4. POJ——1321棋盘问题(DFS+回溯)

    棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33272 Accepted: 16456 Description 在一 ...

  5. android 脱壳 之 dvmDexFileOpenPartial断点脱壳原理分析

    android 脱壳 之 dvmDexFileOpenPartial断点脱壳原理分析 导语: 笔者主要研究方向是网络通信协议的加密解密, 对应用程序加固脱壳技术很少研究, 脱壳壳经历更是经历少之甚少. ...

  6. socket编程-微软小兵

    socket两端建立连接,不断开的连接的情况下做数据交互,客户端发送数据和服务端返回数据.直到客户端要求断开,则关闭连接. 代码目录结构:

  7. C#创建Graphics对象的方法

    方法一.利用控件或窗体的Paint事件中的PainEventArgs 在窗体或控件的Paint事件中接收对图形对象的引用,作为PaintEventArgs(PaintEventArgs指定绘制控件所用 ...

  8. Metasploit笔记之信息收集命令

    书籍参考:Metasploit渗透指南 Nmap:使用没有时 ubuntu自动提示安装命令 用法: nmap -sS -Pn  192.168.1.0 -sS:执行一次隐秘的tcp扫描 -Pn:不使用 ...

  9. npm-debug.log文件出现原因

    项目主目录下总是会出现这个文件,而且不止一个,原因是npm i 的时候,如果报错,就会增加一个此文件来显示报错信息,npm install的时候则不会出现.

  10. MongoDB状态查询详解:db.serverStatus()

    https://www.2cto.com/database/201501/370191.html