我们知道我们可以在项目资源目录res/下放置各种各样的资源,今天我们来了解下这些资源的用途,形式和语法。我们先简单总结一下有哪些资源类型:
【1】动画资源类型Animation Resources
用来定义预定的动画资源。
补间动画放在res/anim/目录下,通过R.anim获取。
帧动画放在res/drawable/目录下,通过R.drawable获取。
【2】颜色状态列表资源Color State List Resource
定义了根据View的状态改变时的颜色资源。
保存在res/color/
中,通过R.color
去获取。
【3】图片资源Drawable Resources
定义了各种bitmap或者XML形式的图像资源。
保存在res/drawable/目录下,通过R.drawable获取。
【4】布局文件资源Layout Resource
定义应用UI的布局资源。
保存在res/layout/
目录下,通过R.layout获取。
【5】菜单资源Menu Resource
定义应用中的菜单内容。
保存在res/menu/目录下,通过R.menu获取。
【6】字符串资源String Resources
定义了字符串,字符串数组和字符串复数(包含格式化资源和样式)。
保存在res/values/目录下,通过
,R.string
和R.array
去获取。R.plurals
【7】样式资源Style Resource
定义了UI元素的外观和形式。
保存在res/values/目录下,通过R.style去获取。
【8】更多资源样式
定义了诸如布尔型,整型,尺寸,颜色和其它数组资源。
保存在res/values/目录下,通过与R类中一一对应的内部类去获取,如R.bool,R.integer,R.dimen等。
下面我们详细去了解下这些类型的资源的使用:
1.动画资源
Android动画资源分为两种:属性动画资源Property Animation和View动画资源View Animation。而其中的View动画资源又分为补间动画Tween animation和帧动画Frame animation。
1.1 属性动画资源
定义在XML中的属性动画资源就是在一段时间内,持续修改目标对象的某个属性,如背景颜色或透明度。
文件位置:res/animator/filename.xml
这个文件名称会作为资源ID。
编译后资源的数据类型:ValueAnimator
,ObjectAnimator 或者 AnimatorSet 。
资源的引用方式:在Java文件中:R.animator.filename 在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>还可以包含
<set>标签。
分析元素标签:
【1】<set>元素标签
这是一个容器标签,它可以包含其它的动画元素标签(<objectAnimator>
, <valueAnimator>
,或其它的<set>
)。它代表AnimatorSet类
。
我们可以使用多个<set>进行嵌套,每个<set>都可以有一个动画组,而且每个<set>标签都可以定义它自己的ordering属性。
属性:
android:ordering属性:取值为指定值。它指定了<set>中包含的动画的播放顺序。它有如下2个取值:
·sequentially :按照在<set>中出现的顺序执行动画
·together
(默认值) :同时执行<set>中的动画
【2】<objectAnimator>
它可以将一个对象的某个属性进行动画,在指定时间段内,不断改变这个属性值。它代表着ObjectAnimator类。
属性:
android:propertyName属性:取值为String类型。是必须指定的属性。要进行动画的对象的属性名。比如说:你可以指定其取值为一个View对象的"alpha"或者"backgroundColor"。<objectAnimator>元素标签并没有一个类似target的属性,所以我们没有办法在XML文件中指定具体哪一个对象执行这个动画。我们必须通过调用loadAnimator()
方法加载这个XML动画资源,然后通过调用setTarget()设置那个包含这个属性值的对象为目标对象。
android:valueTo属性: 取值为float,int 或者 color。是必须指定的属性。这个属性的取值就是当前执行动画的属性在动画结束时的取值。类型为color时,取值表示为6位16进制的数,比如:#333333。
android:valueFrom属性:取值为float,int 或者 color。这个属性值代表着动画开始时的执行动画的属性的取值。如果不指定,动画会在通过执行动画的属性的get方法的取值作为动画开始的值。类型为color时,取值表示为6位16进制的数,比如:#333333。
android:duration属性: 取值为int 。执行动画的时间,单位为毫秒。默认为300ms。
android:startOffset属性: 取值为int 。该值代表start()方法被调用后延迟多少毫秒开始执行动画。
android:repeatCount属性: 取值为int 。动画重复执行多少次。设置为"-1"代表无限循环,或者一个正整数。比如说,如果你设置为1,那么就意味着动画执行完后会重复执行一次,也就是一共会执行2次动画。默认值为0,表示不重复。
android:repeatMode属性: 取值为int 。这个属性取值代表当达到动画末尾时,动画的行为。android:repeatCount属性设置为-1或者正整数时才有效。设置为"reverse"时,动画在末尾时会反向执行回来。设置为"repeat"
时每次又会从最开始的地方执行动画。
android:valueType属性: 取值为指定的值。如果当前执行动画的属性类型是color,那么就不需要指定这个值(不需要指定的意思就是不用包含该属性),动画框架会自动处理颜色值。另外它有2个取值:
·intType 指定执行动画的属性类型是integers
·floatType (默认值) 指定执行动画的属性类型是floats
下面来看一个例子:首先编写一个属性动画资源文件res/animator/property_animator.xml,内容如下:
<set android:ordering="sequentially">
<set>
<objectAnimator
android:propertyName="x"
android:duration="500"
android:valueTo="400"
android:valueType="floatType"/>
<objectAnimator
android:propertyName="y"
android:duration="500"
android:valueTo="300"
android:valueType="<span style="font-family: Arial, Helvetica, sans-serif;">float</span><span style="font-family: Arial, Helvetica, sans-serif;">Type"/></span>
</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();
1.2 View动画资源
View动画又分为了补间动画和逐帧动画,它们同样可以通过XML文件去定义。
1.2.1 补间动画
补间动画是一种能让图形做一些诸如旋转,淡化,移动和伸缩之类的变换的动画。
文件位置:res/anim/filename.xml
这个文件名称会作为资源ID。
编译后的数据类型为:Animation(注意区分属性动画的单词为Animator)。
资源的引用:
在java文件中:R.anim.filename
在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>元素可以包含其它所有的元素,同样也可以嵌套<set>元素。
分析元素标签:
【1】<set>元素标签
<set>元素标签是一个容器标签,它是用来包含其它<alpha>
, <scale>
, <translate>
, <rotate>
4元素标签的。它的数据类型为AnimationSet。
属性:
android:interpolator属性:取值为Interpolator(插补器)资源。改属性值必须是一个插补器的资源引用,而不是一个插补器的类名。插补器是用来影响动画变化率的一个类,有加速,减速,重复等功能的插补器。系统给我们提供了一些默认的插补器,同样我们也能自己去创建插补器。待会我们会学习到它的一些知识。
android:shareInterpolator属性:取值为Boolean类型。“true”表示你希望所有的Child元素标签都使用这个插补器。
【2】<alpha>元素标签
<alpha>元素代表一个淡入或者淡出动画。它的数据类型是AlphaAnimation。
属性:
android:fromAlpha属性:取值为Float。开始动画时候的不透明度。0.0代表透明,1.0代表不透明(这就是我们称它为不透明度的原因)。
android:toAlpha属性: 取值为Float。动画结束时候的不透明度。
(另外属于补间动画的通用属性会在后面附加上...)
【3】<scale>元素标签
代表着伸缩动画。我们可以通过pivotX
和pivotY
来指定动画图像的中心缩放点。比如这个值为(0,0)即屏幕左上角的时候,执行动画的图像会沿着下边和右边缩放。它的数据类型为ScaleAnimation。
属性:
android:fromXScale属性:取值为float。动画开始时X轴方向上的比例。1.0表示没有变化。
android:toXScale属性:取值为float。动画结束时X轴方向上的比例。1.0表示没有变化。
android:fromYScale属性:取值为float。动画开始时Y轴方向上的比例。1.0表示没有变化。
android:toYScale属性:取值为float。动画结束时Y轴方向上的比例。1.0表示没有变化。
android:pivotX属性:取值为float。对象缩放时,X轴上的基准点。
android:pivotY属性:取值为float。对象缩放时,Y轴上的基准点。
【4】<translate>元素标签
一种在垂直或/和水平方向的移动动画。它的所有的属性都支持以下3种形式的取值:
①取值从 -100 到 100 , 以"%"结尾。它代表这是相当于它自身的百分比。
②取值从 -100 到 100 , 以"%p"结尾。它代表这是相当于它父容器的百分比。
③取值是一个float数据,没有后缀。它表明这个一个绝对数值。
对应的数据类型为TranslateAnimation。
属性:
android:fromXDelta属性:取值为float或者百分比值。开始动画时X方向上的值。
android:toXDelta属性:取值为float或者百分比值。结束动画时X方向上的值。
android:fromYDelta属性:取值为float或者百分比值。开始动画时Y方向上的值。
android:toYDelta属性:取值为float或者百分比值。结束动画时Y方向上的值。
【5】<rotate>元素标签
旋转动画。对应的数据类型:RotateAnimation。
属性:
android:fromDegrees属性:取值为float。开始动画时的角度位置,单位为度。
android:toDegrees属性:取值为float。结束动画时的角度位置,单位为度。
android:pivotX属性:取值为float或者百分比值。旋转中心X轴的位置。它的三种取值含义和<translate>标签一致。
android:pivotY属性:取值为float或者百分比值。旋转中心Y轴的位置。它的三种取值含义和<translate>标签一致。
补间动画的通用属性:
android:duration属性:取值为long,单位为毫秒。表示动画执行的时间。
android:fillAfter属性:取值为Boolean。设置为true时,表示将动画执行完的变换效果,应用到执行动画的对象上。
android:fillBefore属性:取值为Boolean。如果该属性设置为true而android:fillAfter属性没有设置为true时,表示将动画执行前的变换效果,应用到执行动画的对象上。
android:interpolator属性:取值为Interpolator(插补器)资源。
android:repeatCount属性:取值为int。含义为动画重复执行的次数,默认值为0.同样你可以设置为-1表示无限循环。
android:repeatMode属性:取值为int。含义为动画重复时的模式。只有当android:repeatCount属性取值大于0或者为-1时有效。取值范围为RESTART
或者REVERSE
,和属性动画的一致。
android:startOffset属性:取值为long,单位为毫秒。动画开始时间到达之后开始动画的延时时间。当使用AnimationSet包含多个动画在不同时间点执行时,这个属性很重要。
先看一个例子:编写动画资源文件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>
然后在java文件中使用该动画资源:
ImageView image = (ImageView) findViewById(R.id.image);
Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
image.startAnimation(hyperspaceJump);
我们再来了解一下插补器的知识:
插补器Interpolator就像动画过程中的一个修补工,他能控制动画的变化速率。使用插补器我们能实现很多动画效果,如加速,加速,反弹,重复等。。。
一个插补器资源可以通过动画的android:interpolator属性应用到动画效果中。
Android系统中,所有的插补器都是Interpolator的子类。下面是Android系统中的一些插补器,和它对应的资源ID:
AccelerateDecelerateInterpolator | @android:anim/accelerate_decelerate_interpolator |
AccelerateInterpolator | @android:anim/accelerate_interpolator |
AnticipateInterpolator | @android:anim/anticipate_interpolator |
AnticipateOvershootInterpolator | @android:anim/anticipate_overshoot_interpolator |
BounceInterpolator | @android:anim/bounce_interpolator |
CycleInterpolator | @android:anim/cycle_interpolator |
DecelerateInterpolator | @android:anim/decelerate_interpolator |
LinearInterpolator | @android:anim/linear_interpolator |
OvershootInterpolator | @android:anim/overshoot_interpolator |
CycleInterpolator
的周期数或者
AnticipateInterpolator的加速速率。为了实现这种调整,我们需要创建我们自己的XML插补器资源。
文件位置:res/anim/filename.xml
文件名会作为资源的ID。
编译后的资源类型:插补器interpolator资源。
资源的引用:
在XML中 : @[package:]anim/filename
语法:
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
android:attribute_name="value"
/>
如果我们不指定任何的属性,这个插补器功能就会和系统提供的插补器一致。
分析元素标签:
注意,在XML中定义的任何一个插补器的实现,都是插补器名称的小写字母开头。
【1】<accelerateDecelerateInterpolator>元素标签:
加速减速插补器,在开始和结束时,变化速率较小,中间时段变化速率较大。它没有属性值。
【2】<accelerateInterpolator>元素标签:
加速插补器。动画开始时变化速率较小,后面一直加快。
属性值:
android:factor属性:取值为float。加速速率。默认值为1。
【3】<anticipateInterpolator>元素标签:
先反向,后正向加速插补器。
属性值:
android:tension属性:取值为float。收张的阶段数。默认值为2
【4】<anticipateOvershootInterpolator>元素标签:
先反向,然后正向加速并且超过目标值,然后慢慢恢复到目标值。
属性值:
android:tension属性:取值为float。收张的阶段数。默认值为2
android:extraTension属性:用来乘以张力的数。默认为1.5.
【5】<bounceInterpolator>元素标签:动画最后反弹变化的插补器。没有属性值。
【6】<cycleInterpolator>元素标签:多次执行的动画。变化速率是正弦函数。
属性值:
android:cycles属性:取值为Integer。默认值为1
【7】<decelerateInterpolator>元素标签:减速插补器。动画开始时,变化速率很快,然后减速。
属性值:
android:factor属性:取值为float。减速速率,默认为1
【8】<linearInterpolator>元素标签:线性插补器。变化速率恒定。没有属性值。
【9】<overshootInterpolator>元素标签:一直加速并超过目标值,然后回到目标值。
属性值:
android:tension属性:取值为float。拉张的阶段数,默认为2
例子:自定义一个有7个拉张阶段数的overshootInterpolator,保存为res/anim/my_overshoot_interpolator.xml:
<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:tension="7.0"
/>
然后在动画资源XML中使用它:
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/my_overshoot_interpolator"
android:fromXScale="1.0"
android:toXScale="3.0"
android:fromYScale="1.0"
android:toYScale="3.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700" />
1.2.2 逐帧动画
逐帧动画就像电影一样,按照顺序播放一系列图片资源。
文件位置:res/drawable/filename.xml
其中文件名称将作为资源的ID。
编译后的资源数据类型:AnimationDrawable
。
资源引用:
在Java文件中:R.drawable.filename
在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>
分析元素标签:
【1】<animation-list>元素标签:
必需元素。而且必须作为根元素标签。它可以包含一个或者多个<item>元素标签。
属性:
android:oneshot属性:取值为Boolean。"true"表示你希望这个动画执行一次,”false“代表跳过这个动画。
【2】<item>元素标签:
代表逐帧动画中的一帧。必须作为<animation-list>元素标签的子元素。
属性:
android:drawable属性:取值为Drawable资源。应用在当前帧上的图像资源
android:duration属性:取值为Integer。当前帧显示的时间,单位为毫秒。
例子:编写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的背景资源,然后播放:
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();
以上内容全是XML中的动画资源。并没有深入学习Android的动画框架。学习完资源之后再去了解动画框架。