最近做项目的时候,没有存放好图的地方,被老大批评了,现在好好做做总结!!
我们应该始终外部化应用资源,例如图像和代码中的字符串,这样有利于我们单独维护这些资源。此外,我们还应该为特定的设备配置提供备用的资源,方法是将它们分组到专门命名的资源目录中。在运行时,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的值
- 320 适用于屏幕配置如下的设备:
- 可用宽度:
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:设备配有显示屏,戴在手腕上:
- car
- 夜间模式:
- 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:此限定符适合所有屏幕密度,其优先级高于其他限定符。这对于矢量可绘制对象很有用。
- ldpi
六个主要密度之间的缩放比为 3:4:6:8:12:16(忽略 tvdpi 密度)。因此,9x9 (ldpi) 位图相当于 12x12 (mdpi)、18x18 (hdpi)、24x24 (xhdpi) 位图,依此类推。
- 触摸类型:
- notouch
finger - notouch:设备没有触摸屏。
- finger:设备有一个专供用户通过手指直接与其交互的触摸屏
- notouch
- 键盘可用性:
- keysexposed
keyshidden
keyssoft - keysexposed:设备具有可用的键盘。如果设备启用了软键盘,那么即使 那么即使硬键盘没有展示给用户,哪怕设备没有硬键盘,也可以使用此限定符。 如果没有提供或已经禁用软键盘,则只有在显示硬键盘时才会使用此限定符。
- keyshidden:设备具有可用的硬键盘,但它处于隐藏状态,且设备没有启用软键盘。
- keyssoft:设备已经启用软键盘(无论是否可见)。
- keysexposed
更多可以参考:https://developer.android.com/guide/topics/resources/providing-resources