从零学Android(七)、Android资源类型之动画资源

我们知道我们可以在项目资源目录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.stringR.arrayR.plurals去获取。

【7】样式资源Style Resource

定义了UI元素的外观和形式。

保存在res/values/目录下,通过R.style去获取。

【8】更多资源样式

定义了诸如布尔型,整型,尺寸,颜色和其它数组资源。

保存在res/values/目录下,通过与R类中一一对应的内部类去获取,如R.boolR.integerR.dimen等。

下面我们详细去了解下这些类型的资源的使用:

1.动画资源

Android动画资源分为两种:属性动画资源Property AnimationView动画资源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>元素标签

代表着伸缩动画。我们可以通过pivotXpivotY来指定动画图像的中心缩放点。比如这个值为(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的动画框架。学习完资源之后再去了解动画框架。

Demo下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值