Android官方文档之App Resources(中)
Posted vanpersie_9987
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android官方文档之App Resources(中)相关的知识,希望对你有一定的参考价值。
本文将继续介绍App Resources中的资源类型(Animation、Color State List、String、Style)。
如果需要了解android中的资源规范,您可以访问我翻译的这篇官方文档:《Android官方文档之App Resources(上)》。
如需访问官方原文,您可以点击这个链接:《Resource Types》。
在下一篇文章中(Android官方文档之App Resources(下)),将介绍App Resources中其余的资源类型(Layout、Menu、Drawable)。
资源类型(Resource Types)
本节将介绍Android中各种资源的类型、格式、语法、以及引用方式。
动画资源(Animation Resources)
配置预定义的动画(Define pre-determined animations)。
其中补间动画(Tween animations)应存储于res/anim/
目录下,并通过R.anim
引用;
帧动画(Frame animations)应存储于 res/drawable/
目录下,并通过 R.drawable
引用;
属性动画(Object animations)应存储于res/animator/
目录下,并通过R.animator
引用。
如需了解有关动画的介绍,您可以访问我翻译的文档:《Android官方文档之Animation》
属性动画(Property Animation)
文件目录:
res/animator/filename.xml
核心类:
ValueAnimator
, ObjectAnimator
, AnimatorSet
。
引用方式:
In Java: R.animator.filename
In XML: @[package:]animator/filename
语法:
<set
android:ordering=["together" | "sequentially"]>
<objectAnimator
android:propertyName="string"
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<animator
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<set>
...
</set>
</set>
根标签必须为<set>, <objectAnimator>, 或 <valueAnimator>之一
。
标签及其属性:
<set>
:可以包含其他动画标签,如<set>, <objectAnimator>, 或 <valueAnimator>
,对应AnimatorSet
类。- 属性:
–android:ordering
:指定动画播放顺序
- 属性:
Value | Description |
---|---|
sequentially | 顺序执行 |
together (默认) | 同时执行 |
<objectAnimator>
:指定某个对象的属性在一定时间内执行的动画。对应ObjectAnimator
类。属性:
–android:propertyName
:String类型,不可缺省。指定View对象的某个属性,如alpha
、backgroundColor
等。应调用loadAnimator()
或setTarget()
方法,将XML属性动画设置到包含了该属性的对象上。–
android:valueTo
:float, int, 或 color类型,不可缺省。指定动画的结束值。其中color是一个6位的16进制数,如#333333
。–
android:valueFrom
:float, int, 或 color类型。指定动画的起始值。若未指定,则将通过属性的get()
方法获取起始值。–
android:duration
:int类型。动画执行的毫秒数,若未指定,则默认为300毫秒。–
android:startOffset
:int类型。调用start()
后延迟的毫秒数。–
android:repeatCount
:int类型。动画的重复次数。设置为“-1”表示无限循环。设置为“0”表示不循环,即只执行一次。设置为“1”表示循环一次,即执行两次。–
android:repeatMode
:int类型。当动画执行完后的行为。需配合android:repeatCount
属性使用(不能为0,可以为正整数或-1),reverse
表示反向执行。repeat
表示重复执行。–
android:valueType
:intType
或floatType(默认)
。指定动画属性值的变化类型。若操作的属性是颜色,则不能指定该属性。
<animator>
:在规定的时间内改变某个属性值。对应ValueAnimator
类。属性:
–
android:valueTo
:float, int, 或 color 类型,不可缺省。–
android:valueFrom
:float, int, 或 color 类型,不可缺省。–
android:duration
:int类型。缺省值为300毫秒。–
android:startOffset
:int类型。–
android:repeatMode
: int类型。–
android:valueType
:intType
、或floatType(默认)
- 举例:
<!-- res/animator/property_animator.xml -->
<set android:ordering="sequentially">
<set>
<objectAnimator
android:propertyName="x"
android:duration="500"
android:valueTo="400"
android:valueType="intType"/>
<objectAnimator
android:propertyName="y"
android:duration="500"
android:valueTo="300"
android:valueType="intType"/>
</set>
<objectAnimator
android:propertyName="alpha"
android:duration="500"
android:valueTo="1f"/>
</set>
在Java代码中引入:
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.anim.property_animator);
set.setTarget(myObject);
set.start();
补间动画(View Animation/Tween animation)
文件目录:
res/anim/filename.xml
核心类:
Animation
引用方式:
In Java: R.anim.filename
In XML: @[package:]anim/filename
语法:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>
根标签必须为<alpha>, <scale>, <translate>, <rotate>, 或<set>之一
。
标签及其属性:
<set>
:补间动画集合。对应AnimationSet
类。–
android:interpolator
:插值器资源。具体含义请参考《Android官方文档之Animation》中有关interpolator
的介绍。–
android:shareInterpolator
:Boolean类型。若设置为true,表示该标签中的所有直接子标签共享一个interpolator
。<alpha>
:透明度动画。淡入淡出效果(A fade-in or fade-out animation)。对应AlphaAnimation
类。–
android:fromAlpha
:Float类型。起始透明度。0.0表示完全透明,1.0表示完全不透明。–
android:toAlpha
:Float类型。终止透明度。0.0表示完全透明,1.0表示完全不透明。
<scale>
:缩放动画。对应ScaleAnimation
类。–
android:fromXScale
:Float类型。x方向的起始缩放比例,若为1.0,表示无缩放。–
android:toXScale
:Float类型。x方向的最终缩放比例。–
android:fromYScale
:Float类型。y方向的起始缩放比例,若为1.0,表示无缩放。–
android:toYScale
:Float类型。y方向的最终缩放比例。–
android:pivotX
:Float类型。x方向的缩放中心。–
android:pivotY
:Float类型。y方向的缩放中心。
<translate>
:平移动画。对应TranslateAnimation
类。平移的值支持三种格式。一、值从-100到100,以%结束,表示相对于自己本身平移。二、值从-100到100,以%p结束,表示相对于父控件平移。三、没有后缀,只是一个值,表示平移的绝对数值。–
android:fromXDelta
:Float 或百分比类型。x方向的起始平移位置。平移的距离为5dp(5);平移的距离为控件宽度的5%(5%);平移的距离为父控件宽度的5%(5%p)。–
android:toXDelta
:Float 或百分比类型。x方向的终止平移位置。–
android:fromYDelta
:Float 或百分比类型。y方向的起始平移位置。–
android:toYDelta
:Float 或百分比类型。y方向的终止平移位置。
<rotate>
:旋转动画。对应RotateAnimation
类。–
android:fromDegrees
:Float类型。旋转起始角度。–
android:toDegrees
:Float类型。旋转终止角度。–
android:pivotX
:Float或百分比类型。x坐标旋转中心。–
android:pivotY
:Float或百分比类型。y坐标旋转中心。
- 示例:
<!-- res/anim/hyperspace_jump.xml -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
<set
android:interpolator="@android:anim/accelerate_interpolator"
android:startOffset="700">
<scale
android:fromXScale="1.4"
android:toXScale="0.0"
android:fromYScale="0.6"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400" />
<rotate
android:fromDegrees="0"
android:toDegrees="-45"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400" />
</set>
</set>
引入到代码中:
ImageView image = (ImageView) findViewById(R.id.image);
Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
image.startAnimation(hyperspaceJump);
帧动画(Frame animation)
文件目录:
res/drawable/filename.xml
核心类:
AnimationDrawable
引用方式:
In Java: R.drawable.filename
In XML: @[package:]drawable.filename
语法:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>
标签及属性:
<animation-list>
:不可缺省,且必须作为根标签。–
android:oneshot
:boolean类型。若为true表示重复执行。<item>
:每一帧动画。–
android:drawable
:drawable资源。–
android:duration
:这一帧的展示时间。
- 举例:
<!-- res/anim/rocket.xml -->
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>
在Java中引入:
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();
颜色状态列表资源(Color State List Resource)
用于切换控件在不同状态时的不同颜色的资源文件。
文件位置:
res/color/filename.xml
核心类:
ColorStateList
引用方式:
In Java: R.color.filename
In XML: @[package:]color/filename
语法:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:color="hex_color"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_window_focused=["true" | "false"] />
</selector>
元素及属性:
<selector>
:不可缺省。必须是根标签。并包含多个<item>
标签。<item>
:定义某个状态下的颜色。–
android:color
:不可缺省。16进制数。用于指定RGB值及可选的alpha通道:#RGB、#ARGB、#RRGGBB、#AARRGGBB–
android:state_pressed
:boolean类型。表示控件是否处于被点击( touched/clicked)状态。–
android:state_focused
:boolean类型。表示控件是否处于获得焦点状态。–
android:state_selected
:boolean类型。表示控件是否被选中。–
android:state_checkable
:boolean类型。表示控件是否是可检勾选的(仅适用于可勾选的控件)。–
android:state_checked
:boolean类型。表示控件是否处于勾选状态(仅适用于可勾选的控件)。–
android:state_enabled
:boolean类型。表示控件是否处于使能状态(即可以接受 touch/click事件)。–
android:state_window_focused
:boolean类型。表示应用窗口是否处于拥有焦点(应用在前台)。
举例:
<!-- res/color/button_text.xml -->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:color="#ffff0000"/> <!-- pressed -->
<item android:state_focused="true"
android:color="#ff0000ff"/> <!-- focused -->
<item android:color="#ff000000"/> <!-- default -->
</selector>
在Button中引用该资源:
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/button_text"
android:textColor="@color/button_text" />
Style资源(Style Resource)
Style资源用于定义UI的样式。一个样式可以作用某个View上,也可以作用在整个Activity甚至是Application上。如需了解样式和主题的官方介绍,您可以点击这个链接:《Styles and Themes》。
!请注意:style是一个单独的资源,如需引用该资源,需要引用的是name
属性中定义的名字,而不是XML文件的名字。所以,您可以将所有的style资源都定义在一个XML文件中,并将<resources>
标签作为根标签。
文件目录:
res/values/filename.xml
引用方式:
In XML: @[package:]style/style_name
语法:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style
name="style_name"
parent="@[package:]style/style_to_inherit">
<item
name="[package:]style_property_name"
>style_value</item>
</style>
</resources>
标签及其属性:
<resources>
:不可缺省,且必须是根标签。无属性。<style>
:定义一个样式,可包含<item>
标签。–
name
:String类型,不可缺省。样式的名字。Activity、Application或View所引用的ID就是这个名字。–
parent
:Style 资源。继承其他style资源。<item>
:为style定义一个属性。必须是<style>
的子标签。–
name
:属性资源,不可缺省。用于定义某个属性,如android:textColor
。
示例:
<!-- res/values/ -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomText" parent="@style/Text">
<item name="android:textSize">20sp</item>
<item name="android:textColor">#008</item>
</style>
</resources>
将上述style应用于TextView上:
<!-- res/layout/ -->
<?xml version="1.0" encoding="utf-8"?>
<EditText
style="@style/CustomText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello, World!" />
String资源(String Resources)
用于为应用程序提供字符串资源。有以下三种字符串的格式:
String:用于提供一个单独的字符串;
String Array:用于提供一个字符串数组;
Quantity Strings (Plurals):用于提供复数的字符串(carries different strings for pluralization)。
单独的字符串资源(String)
字符串资源可以被Java程序或XML文件引用。
!请注意:String是一个单独的资源,如需引用该资源,需要引用的是name
属性中定义的名字,而不是XML文件的名字。所以,您可以将所有的String资源都定义在一个XML文件中,并将<resources>
标签作为根标签。
文件目录:
res/values/filename.xml
引用方式:
In Java: R.string.string_name
In XML:@string/string_name
语法:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string
name="string_name">text_string</string>
</resources>
标签及其属性:
<resources>
:不可缺省,必须为根标签。无属性。<string>
:值为您所指定的字符串内容。–
name
:String类型。字符串的键。通过ID引用的就是这个键。
示例:
<!-- res/values/strings.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello!</string>
</resources>
引用上述字符串资源:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
在Java中引用上述资源:
String string = getString(R.string.hello);
字符串数组资源(String Array)
一个字符串数组资源,可以在程序中引用。
!请注意:String Array是一个单独的资源,如需引用该资源,需要引用的是name
属性中定义的名字,而不是XML文件的名字。所以,您可以将所有的String Array资源都定义在一个XML文件中,并将<resources>
标签作为根标签。
文件目录:
res/values/filename.xml
引用方式:
In Java: R.array.string_array_name
语法:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array
name="string_array_name">
<item>text_string</item>
</string-array>
</resources>
标签及其属性:
<resources>
:不可缺省,且必须是根标签。无属性<string-array>
:定义了一组字符串资源。每一个字符串用一个<item>
标签包含。–
name
:String类型。字符串数组的键。程序中的ID就是该键。<item>
:String类型。用于定义一个字符串。必须包含在<string-array>
标签内。无属性。
示例:
<!-- res/values/strings.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
</string-array>
</resources>
在代码中引用该字符串数组资源:
Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);
复数的字符串资源(Quantity Strings (Plurals))
不同的语言在单复数上具有不同的语法规则。在英语中,1表示单数,如“1 book”,大于1表示复数,如“n books”,这种单复数的的区别在英语中很常见,而其他语言在单复数的处理上与英语的语法又有很大区别(如中文语法没有明显体现复数的概念)。为了支持不同语言的单复数规则,Android提供了zero、one、 two、 few、 many、 other
等枚举值。
Android提供了getQuantityString()
方法来选择合适的单复数资源。
复数的字符串资源只能用于复数。
!请注意:Quantity Strings是一个单独的资源,如需引用该资源,需要引用的是name
属性中定义的名字,而不是XML文件的名字。所以,您可以将所有的Quantity Strings资源都定义在一个XML文件中,并将<resources>
标签作为根标签。
文件目录:
res/values/filename.xml
引用方式:
In Java: R.plurals.plural_name
语法:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals
name = "plural_name">
<item quantity = ["zero"|"one"|"two"|"few"|"many"|"other"]>text_string</item>
</plurals>
</resources>
标签及其属性:
<resources>
:不可缺省,且必须作为根标签。无属性。<plurals>
:一个字符串的集合。该标签中包含若干个<item>
标签。–
name
:String类型。引用该资源的键。程序ID引用的就是这个键。<item>
:包含一个单数或复数的字符串。值可以引用其他字符串资源。–
quantity
:为以下若干Value值。
Value | Description |
---|---|
zero | 在某种语言中,当末尾数字为0时,需要特殊处理。如阿拉伯语。 |
one | 在某种语言中,当末尾数字为1时,需要特殊处理。如英语和其他大多数语言;在俄语中,除了11以外的其他以1结尾的数字,属于这一类型。 |
two | 在某种语言中,当末尾数字为2时,需要特殊处理。如威尔士语中的2;斯洛文尼亚语中的102。 |
few | 在某种语言中,较小的数字需要特殊处理。如捷克语中的2、3、4;波兰语中除了12、13、14以外,以2、3、4结尾的数字。 |
many | 在某种语言中,较大的数字需要特殊处理。如马耳他语中以11-99结尾的数字。 |
other | 在某种语言中,并没有明显的单复数概念。如中文。 |
示例:
<!-- res/values/strings.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="numberOfSongsAvailable">
<!--
As a developer, you should always supply "one" and "other"
strings. Your translators will know which strings are actually
needed for their language. Always include %d in "one" because
translators will need to use %d for languages where "one"
doesn't mean 1 (as explained above).
-->
<item quantity="one">%d song found.</item>
<item quantity="other">%d songs found.</item>
</plurals>
</resources>
<!-- res/values-pl/strings.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="numberOfSongsAvailable">
<item quantity="one">Znaleziono %d piosenkę.</item>
<item quantity="few">Znaleziono %d piosenki.</item>
<item quantity="other">Znaleziono %d piosenek.</item>
</plurals>
</resources>
在Java中引用资源:
int count = getNumberOfsongsAvailable();
Resources res = getResources();
String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable, count, count);
需要注意的是,如果您引用的XML文件中包含了格式化的字符(如%d),那么需要在getQuantityString()
方法中传入三个参数。其中第二个参数用于让系统决定应该选择哪个item标签中的资源,而第三个参数是一个可变数组,用于替换格式化的字符(如%d)。如果您在字符串资源中未指定格式化的字符,那么可以不传入第三个参数。
设计您的字符串资源(Formatting and Styling)
转义单引号和双引号(Escaping apostrophes and quotes)
如果您的字符串中包含了单引号(’),那么需要在单引号前加一个反斜杠(\\),以便在字符串中能正确识别这个单引号;或者直接用双引号包含整个字符串,如下所示:
<!-- 正确的表示法,在单引号前加一个反斜杠(\\) -->
<string name="good_example">This\\'ll work</string>
<!-- 正确的表示法,直接用双引号包含整个字符串 -->
<string name="good_example_2">"This'll also work"</string>
<!-- 错误的表示法,编译错误 -->
<string name="bad_example">This doesn't work</string>
如果您的字符串中包含了双引号(”),那么需要在双引号前加一个反斜杠(\\),以便在字符串中能正确识别这个双引号。但是,用双引号包含整个字符串的方式不再可行:
<!-- 正确的表示法,在双引号前加一个反斜杠(\\) -->
<string name="good_example">This is a \\"good string\\".</string>
<!-- 错误的表示法,双引号将被忽略 -->
<string name="bad_example">This is a "bad string".</string>
<!-- 错误的表示法,编译错误 -->
<string name="bad_example_2">'This is another "bad string".'</string>
格式化字符串(Formatting strings)
通过调用String.format(String, Object...)
方法,可以将字符串进行格式化。如:
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
上述字符串中,%1$s
表示一个字符串,%2$d
表示一个十进制数。由于format()
方法中的第二个参数是一个可变数组,您可以将参数传入其中以替换这些转义字符:
Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
使用html标记语言定制字符串样式(Styling with HTML markup)
如:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="welcome">Welcome to <b>Android</b>!</string>
</resources>
Android支持的HTML标签包括:
<b>
表示文本加粗;<i>
表示斜体;<u>
表示添加下划线。
为了使HTML标签生效,需要使用转义的HTML字符:
<resources>
<string name="welcome_messages">Hello, %1$s! You have <b>%2$d new messages</b>.</string>
</resources>
其中,左尖括号(”<
“)被替换为HTML转移字符串(”<
“)。
接着调用fromHtml(String)
方法,使HTML标签生效。
Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
CharSequence styledText = Html.fromHtml(text);
调用htmlEncode()
方法确保传入的字符串参数已被转义,因为只有被转义后的字符串才能使HTML标签生效:
String escapedUsername = TextUtil.htmlEncode(username);
Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), escapedUsername, mailCount);
CharSequence styledText = Html.fromHtml(text);
使用Spannables样式(Styling with Spannables)
Spannables可以将若干不同样式(如颜色、字号)的文本对象拼接在一起:
/**
* Returns a CharSequence that concatenates the specified array of CharSequence
* objects and then applies a list of zero or more tags to the entire range.
*
* @param content an array of character sequences to apply a style to
* @param tags the styled span objects to apply to the content
* such as android.text.style.StyleSpan
*
*/
private static CharSequence apply(CharSequence[] content, Object... tags) {
SpannableStringBuilder text = new SpannableStringBuilder();
openTags(text, tags);
for (CharSequence item : content) {
text.以上是关于Android官方文档之App Resources(中)的主要内容,如果未能解决你的问题,请参考以下文章
Android官方开发文档Training系列课程中文版:多样屏幕之支持不同的屏幕尺寸
Android官方文档之Creating a Content Provider