Android应用资源

最近做项目的时候,没有存放好图的地方,被老大批评了,现在好好做做总结!!

我们应该始终外部化应用资源,例如图像和代码中的字符串,这样有利于我们单独维护这些资源。此外,我们还应该为特定的设备配置提供备用的资源,方法是将它们分组到专门命名的资源目录中。在运行时,Android会根据当前配置使用适当的资源。例如,我们可能需要根据屏幕尺寸提供不同的UI布局,或者根据语言设置提供不同的字符串。

分组资源类型:
您应将各种资源放入项目 res/ 目录的特定子目录下。例如,以下是一个简单项目的文件层次结构:

MyProject/
    src/  
        MyActivity.java  
    res/
        drawable/  
            graphic.png  
        layout/  
            main.xml
            info.xml
        mipmap/  
            icon.png 
        values/  
            strings.xml

我们可以看到,在res/目录包含所有资源(子目录下):一个图像资源,两个布局资源,启动器图标的mipmap/目录以及一个字符串资源文件。
res/目录内支持的资源目录:
animator/:用于定义属性动画的XML文件
anim/:定义渐变动画的XML文件
color/:用于定义颜色状态列表的XML文件
drawable/:位图文件(.png, .9.png, .jpg, gif)或编译为以下可绘制对象资源子类型的XML文件:

  • 位图文件
  • 九宫格(可调整大小的位图)
  • 状态列表
  • 形状
  • 动画可绘制对象
  • 其他可绘制对象

  • mipmap/:适用于不同启动器图标密度的可绘制对象文件。
  • layout/:用于定义用户界面布局的XML文件
  • menu/:用于定义应用菜单(如选项菜单,上下文菜单或子菜单)的XML文件
  • raw/:要以原始形式保存的任意文件,要使用原始InputStream打开这些资源,请使用资源 ID(即 R.raw.filename)调用 Resources.openRawResource()。
  • values/:包含字符串,整数型和颜色等简单的XML文件。
    其他res/子目录中的XML资源文件是根据XML文件名定义单个资源,而values/目录中的文件可描述多个资源,对于此目录中的文件,<resource>元素的每个子元素均定义一个资源。例如,<String>元素创建R.string资源,<color>元素创建R.color资源。
    由于每个资源均用其自己的 XML 元素定义,因此您可以根据自己的需要命名文件,并将不同的资源类型放在一个文件中。但是,为了清晰起见,您可能需要将独特的资源类型放在不同的文件中。 例如,对于可在此目录中创建的资源,下面给出了相应的文件名约定:
    • arrays.xml,用于资源数组(类型化数组)。
    • colors.xml:颜色值。
    • dimens.xml:尺寸值。
    • strings.xml:字符串值。
    • styles.xml:样式

  • xml/ 可以在运行时通过调用 Resources.getXML() 读取的任意 XML 文件。各种 XML 配置文件(如可搜索配置)都必须保存在此处。

上面的都是默认资源,即,这些资源定义应用的默认设计和内容。但是,采用Android技术的不同设备类型可能需要不同类型的资源。例如,如果设备的屏幕尺寸大于标准屏幕,则提供不同的布局资源,以充分利用额外的屏幕空间。或者没如果设备的语言设置不同,则应提供不同的字符串资源,以转换用户界面中的文本。

提供备用资源

几乎每个应用都应提供备用资源以支持特定的设备配置。 例如,对于不同的屏幕密度和语言,您应分别包括备用可绘制对象资源和备用字符串资源。 在运行时,Android 会检测当前设备配置并为应用加载合适的资源。

例如,以下是一些默认资源和备用资源:

res/
    drawable/   
        icon.png
        background.png    
    drawable-hdpi/  
        icon.png
        background.png

配置限定符:

配置 限定符 说明
  • MCC和MNC
    • 实例:mcc310,mcc310-mnc004,mcc208-mnc00,等等
    • 移动国家代码 (MCC),(可选)后跟设备 SIM 卡中的移动网络代码 (MNC)。例如,mcc310 是指美国的任一运营商,mcc310-mnc004 是指美国的 Verizon 公司,mcc208-mnc00 是指法国的 Orange 公司。 如果设备使用无线电连接(GSM 手机),则 MCC 和 MNC 值来自 SIM 卡。也可以单独使用 MCC(例如,将国家/地区特定的合法资源包括在应用中)。如果只需根据语言指定,则改用“语言和区域”限定符(稍后进行介绍)。 如果决定使用 MCC 和 MNC 限定符,请谨慎执行此操作并测试限定符是否按预期工作。

  • 语言和区域
    • 示例:en,fr,en-rUS,fr-rFR,fr-rCA,等等
    • 语言通过由两个字母组成的 ISO 639-1 语言代码定义,可以选择后跟两个字母组成的 ISO 3166-1-alpha-2 区域码(前带小写字母“r”)。这些代码不区分大小写;r 前缀用于区分区域码。 不能单独指定区域。

  • 布局方向
    • ldrtl,ldltr|应用的布局方向。
    • ldrtl 是指“布局方向从右到左”。ldltr 是指“布局方向从左到右”,这是默认的隐式值。它适用于布局、图片或值等任何资源。例如,若要针对阿拉伯语提供某种特定布局,并针对任何其他“从右到左”语言(如波斯语或希伯来语)提供某种通用布局,则可编码如下:
res/
    layout/   
        main.xml  (Default layout)
    layout-ar/  
        main.xml  (Specific layout for Arabic)
    layout-ldrtl/  
        main.xml  (Any "right-to-left" language, except
                  for Arabic, because the "ar" language qualifier
                  has a higher precedence.)

  • smallestWdith:
    • sw<N>dp
      示例:
      sw320dp,sw600dp,sw720dp等等
    • 屏幕的基本尺寸,由可用屏幕区域的最小尺寸指定。具体来说,设备的samllestWdith是屏幕可用高度和宽度的最小尺寸。无论屏幕的当前方向如何,我们均可使用此限定符确保应用UI的可用的宽度至少为<N>dp
    • 例如,如果布局要求屏幕区域的最小尺寸始终至少为600dp,则可适用此限定符创建布局资源,res/layout-sw600dp/。仅当可用屏幕的最小尺寸至少为 600dp 时,系统才会使用这些资源,而不考虑 600dp 所代表的边是用户所认为的高度还是宽度。smallestWidth 是设备的固定屏幕尺寸特性;设备的 smallestWidth 不会随屏幕方向的变化而改变。
    • 设备的smallestWidth将屏幕装饰yauns和系统UI考虑在内。例如,如果设备上的屏幕上有一些永久性UI元素占据沿smallestWdith轴空间,则系统会声明smallestWdith小于屏幕实际尺寸。
    • 以下是一些可用于普通屏幕尺寸的值:
      • 320 适用于屏幕配置如下的设备:
        • 240x320 ldpi(QVGA手机)
        • 320x480 mdpi(手机)
        • 480x800 hdpi(高密度手机)
      • 480,适用于480x800 mdpi之类的屏幕(平板电脑/手机)
      • 600 ,适用于600x1024 mdpi之类的屏幕(7英寸平板电脑)
      • 720 ,适用于720x1280 mdpi之类的屏幕(10英寸平板电脑)
        应用为多个资源目录提供不同的smallestWdith限定符值时,系统会使用最接近(但为超出)设备smallestWidth的值

  • 可用宽度:
    • w<N>dp
    • 示例:w720dp,w1024dp等等
    • 指定资源应该使用的最小可用屏幕宽度,以dp为单位。在横向和纵向之间切换时,为了匹配当前实际宽度,此配置值也会随之发生变化。

  • 可用高度:
    • h<N>dp
    • 示例:h720dp,h1024dp等等
    • 指定资源应该使用的最小可用屏幕高度,以dp为单位。在横向和纵向之间切换时,为了匹配当前实际宽度,此配置值也会随之发生变化。

  • 屏幕尺寸:
    • small,normal,large,xlarge
    • small:尺寸类似于低密度QVGA屏幕的屏幕。小屏幕的最小布局尺约为320x426dp。
      例如,QVGA 低密度屏幕和 VGA 高密度屏幕。
    • normal:尺寸类似于中等密度HVGA屏幕的屏幕。标准屏幕的最小布局约为320x470dp。
      单位。例如,WQVGA 低密度屏幕、HVGA 中等密度屏幕、WVGA 高密度屏幕。
    • large :尺寸类似于中等密度VGA屏幕的屏幕。大屏幕的最小布局尺寸约为480x640dp。
      例如,VGA 和 WVGA 中等密度屏幕。
    • xlarge:明显大于传统中等密度 HVGA 屏幕的屏幕。超大屏幕的最小布局尺寸约为 720x960 dp 单位。在大多数情况下,屏幕超大的设备体积过大,不能放进口袋,最常见的是平板式设备。 API 级别 9 中的新增配置。

注意:如果所有资源均使用大于当前屏幕的尺寸限定符,则系统不会使用这些资源,并且应用在运行时将会崩溃(例如,如果所有布局资源均用 xlarge 限定符标记,但设备是标准尺寸的屏幕)
参阅 screenLayout 配置字段,该字段表示屏幕是小尺寸、标准尺寸还是大尺寸。


  • 屏幕横纵比:
    • long,notlong
    • long:long:宽屏,如 WQVGA、WVGA、FWVGA
    • notlong:非宽屏,如 QVGA、HVGA 和 VGA

  • 圆形屏幕:
    • port,land
    • port:设备处于纵向(垂直)
    • 设备处于横向(水平)

  • UI模式:
    • car
      desk
      television
      appliance watch
    • car:设备正在车载手机座上显示
    • desk:设备正在桌面手机座上显示
    • television:设备正在电视上显示,为用户提供“十英尺”体验,其 UI 位于远离用户的大屏幕上,主要面向方向键或其他非指针式交互
    • appliance:设备用作不带显示屏的装置
    • watch:设备配有显示屏,戴在手腕上:

  • 夜间模式:
    • night,notnight
    • nitght:夜间
    • notnight:白天

如果夜间模式停留在自动模式(默认),它有可能在应用生命周期中发生改变。在这种情况下,该模式会根据当天的时间进行调整


  • 屏幕像素密度(pdi):
    • ldpi
      mdpi
      hdpi
      xhdpi
      xxhdpi
      xxxhdpi
      nodpi
      tvdpi
      anydpi
    • ldpi:低密度屏幕,约为120dpi。
    • mdpi:中等密度屏幕,约为160dpi。
    • hdpi:高密度屏幕,约为240dpi。
    • xhdpi:超高密度屏幕,约为320dpi。
    • xxhdpi:超超高密度屏幕,约为480dpi。
    • xxxhdpi:超超超高密度屏幕使用(仅限启动器图标),约为640dpi。
    • nodpi:它可用于我们不希望缩放以匹配设备密度的位图资源。
    • tvdpi:密度介于mdpi和hdpi之间的屏幕,约为213dpi。它并不是“主要”密度组, 主要用于电视,而大多数应用都不需要它。对于大多数应用而言,提供 mdpi 和 hdpi 资源便已足够,系统将根据需要对其进行缩放
    • anydpi:此限定符适合所有屏幕密度,其优先级高于其他限定符。这对于矢量可绘制对象很有用。

六个主要密度之间的缩放比为 3:4:6:8:12:16(忽略 tvdpi 密度)。因此,9x9 (ldpi) 位图相当于 12x12 (mdpi)、18x18 (hdpi)、24x24 (xhdpi) 位图,依此类推。


  • 触摸类型:
    • notouch
      finger
    • notouch:设备没有触摸屏。
    • finger:设备有一个专供用户通过手指直接与其交互的触摸屏

  • 键盘可用性:
    • keysexposed
      keyshidden
      keyssoft
    • keysexposed:设备具有可用的键盘。如果设备启用了软键盘,那么即使 那么即使硬键盘没有展示给用户,哪怕设备没有硬键盘,也可以使用此限定符。 如果没有提供或已经禁用软键盘,则只有在显示硬键盘时才会使用此限定符。
    • keyshidden:设备具有可用的硬键盘,但它处于隐藏状态,且设备没有启用软键盘。
    • keyssoft:设备已经启用软键盘(无论是否可见)。

更多可以参考:https://developer.android.com/guide/topics/resources/providing-resources

猜你喜欢

转载自blog.csdn.net/qq_36391075/article/details/80432634