找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

Android是怎样匹配资源的

Android是怎样匹配资源的
回复

使用道具 举报

大神点评(1)

针对大多数APK应用程序,开发人员都会提供各种不同的资源。比如对于同一张图片image.png,我们通常会提供高分辨率,中分辨率和低分辨率三个版本。
res/
    drawable/
            image.png
    drawable-hdpi/
            image.png
    drawable-mdpi/
            image.png
    drawable-ldpi/
            image.png它们都必须以相同的名字存储在各个drawable目录下。当应用程序运行时,系统会根据当前设备的实际分辨率来选择最佳的资源。
那么系统运行时如何动态选择最合适的资源来使用呢?
理解最佳资源的匹配过程至少有两个好处:
    当设计应用程序时,我们可以有针对性地提供正确的资源。对于适配多种设备有重要的指导意义。
资源标签属性及优先级理解最佳资源匹配过程之前,我们先来看一下资源标签的属性和优先级。所谓优先级顺序指的是Android规定的资源标签属性的优先级。
其实除了分辨率外,同种资源之间还可以有下面许多资源属性标签,它们在匹配过程中是有优先级顺序的。
以下资源标签修饰语按照优先级从高到低的顺序排列。
    MCC和MNC
    MCC(Mobile Country Code)和MNC(Mobile Network
    Code)是网络运营商的全球唯一编号。其中MCC指国家码,MNC指网络号。

    例如,MCC-310属于美国,MCC-460属于中国。460-00代表中国移动,460-01代表中国联通。一般情况下,SIM卡中存有此卡的主归属地。
    用作资源标签时,可以同时使用MCC和MNC
    组合,也可以只使用MCC。例如,mcc460,mcc460-mnc00。程序编码时,可以使用Configuration类中的mcc和mnc属性来获取当前设备的这两个值。
    语言和地区
    Android系统采用ISO
    639-1国际语言码,由两个字母组成。地区代码遵循3166-1-alpha-2标准执行,也由两个字母组成,是可选的。如何组合使用需要加”r”.例如en表示英语,fr表示法语,en-rUS表示英语和美国地区。程序中可以通过Configuration类的locale属性值来获取当前设备的语言地区信息。
    最小宽度(Smallest Width)
    格式为 sw<N>dp
    例如用res/layout-sw600dp来标志自己的布局资源,相当于告诉系统,屏幕的可显示尺寸必须在任何时刻都大于600dp(不管横屏还是竖屏),才可以使用这一资源。与设备语言值不同的是,设备最小宽度不会随系统设置的变化而改变,它是固定的。

    可以在AndroidManifest.xml中,通过指定"android:requiresSmallestWidthDp"属性值来表示此程序要求的最小宽度值。代码中可以通过Configuration类中的smallestScreenWidthDp成员变量来获取当前设备的最小宽度值。
    可用宽度(Available Width)
    格式为 w<N>dp
    设备的可用宽度值随着当前是横屏还是竖屏会产生变化,即它表示的是当前真实的宽度值。如果多种可选资源中都采用了这一标签修饰,那么系统会自动选择一个最接近于(但不超过)当前值得资源。

    例如w720dp,代码中可以通过Configuration类的screenWidthDp成员变量来获取当前的可用宽度值。
    可用高度(Available Height)
    格式为:h<N>dp
    和可用宽度表达含义类似,只不过这里值高度。代码中可以通过Configuration类的screenHeightDp成员变量来获取当前的可用宽度值。
    屏幕大小(Screen Size)
    Android设备尺寸众多,大致将屏幕尺寸分为以下几类:
      small
      尺寸类似于QVGA-低密度和VGA-高密度的屏幕,归属于这一类。最小尺寸布局约为320*426dp。normal
      尺寸类似于HVGA-中密度,WVGA-低密度和WQVGA-低密度的屏幕属于这一类。最小尺寸约为320*470dp.large
      尺寸类似于VGA-中密度和WVGA-中密度的屏幕属于这一类。最小尺寸约为480*640dp.xlarge

      对于尺寸远超过HVGA-中密度的屏幕属于这一类。最小布局尺寸约为720*960dp,这种尺寸基本用于平板电脑而不是移动电话。
    代码中通过Configuration类中的screenLayout成员变量来获取当前设备的屏幕大小。
    屏幕宽高外观(Screen Aspect)
    指的是当前屏幕的宽高比(aspect ratio)。分为以下两种
      long
      长屏幕,如WQVGA,WVGA,FWVGA等。nolong
      非长屏幕,如QVGA,HVGA,VGA等。
      可以通过Configuration类中的screenLayout成员变量来获知屏幕是否为长屏。
    屏幕方向(Screen Orientation)
    分为两种,竖屏(port)和横屏(land)。

    这个值会随着用户的操作而变化,但我们可以通过Configuration类中的orientation成员变量来获知当前设备的屏幕方向。
    UI模式(UI mode)
    分为以下几种:car,desk,television,appliance.

    表示设备被放置在底盘(dock)时的模式,如汽车上的手机托盘,桌面托盘等。这个模式会随着用户的操作而改变,可以通过UiModeManager来开启和关闭这一功能。
    夜间模式(Night Mode)
    分为两种,night(处于夜间模式)和notnight(非夜间模式)。
    可以通过UiModeManager来开启和关闭这一功能。
    屏幕像素密度(dpi)
      ldpi
      低密度屏幕,大约120dpimdpi
      中密度屏幕,大约160dpihdpi
      高密度屏幕,大约240dpixhdpi
      超高密度屏幕,大学320dpinodpi
      表示这些资源不希望被改变尺寸以适应屏幕。tvdpi
      介于mdpi和hdpi之间,大约213dpi,主要用于电视产品,普通应用程序并不推荐使用。
    触摸屏类型(Touchscreen Type)
    分为notouch(设备不带触摸屏)和finger(触摸屏通过手指操作)。

    通过Configuration类中的touchscreen成员变量来获知当前设备的触摸屏类型。
    键盘可用性
    分为以下三种状态
      keysexposed
      设备有可用键盘。如果当前的软键盘被启用,那么即便设备没有键盘或者键盘不可用,这个状态仍可能有效。keyshidden
      设备有键盘,但当前被隐藏,而且没有软键盘启用。keysoft
      设备当前软键盘启动,即便它处于可见或不可见状态。
    这个值在运行过程中会发生变化,可以通过Configuration类的hardkeyboardHidden和keyboardHidden变量来获知当前状态。

回复 支持 反对

使用道具 举报

说点什么

您需要登录后才可以回帖 登录 | 立即注册
HOT • 推荐