Android--Animation标签介绍

来源:互联网 发布:非线性最优化试题 编辑:程序博客网 时间:2024/04/29 04:53

Drawable讲过三个动画,animation-list定义帧动画,animated-rotate定义旋转动画,animated-selector定义选择状态动画,这三个属于drawable动画(也称Frame-By-Frame Animation)。除了drawable动画,Android框架还提供了另外两种动画体系:视图动画(View Animation 也称Tweened Animations)和属性动画(Property Animation)。视图动画比较简单,只能应用于各种View,可以做一些位置、大小、旋转和透明度的简单转变。属性动画则是在android 3.0引入的动画体系,提供了更多特性和灵活性,也可以应用于任何对象,而不只是View。

1、View Animation

视图动画可以通过xml文件定义,xml文件放于res/anim/目录下,根元素可以为:<alpha>, <scale>, <translate>, <rotate>, 或者<set>。其中,set 标签定义的是动画集,它可以包含多个其他标签,也可以嵌套标签。默认情况下,所有动画会同时播放;如果想按顺序播放,则需要指定startOffset属性;另外,还可以通过设置interpolator改变动画变化的速率,比如匀速、加速。对 Interpolator 有兴趣的朋友可以看看我的博客Android动画–Interpolator的介绍。

1、alpha

alpha 可以实现透明度渐变的动画效果,也就是淡入淡出的效果,可通过设置下面三个属性来设置淡入或淡出效果:

  • android:duration 动画从开始到结束持续的时长,单位为毫秒
  • android:fromAlpha 动画开始时的透明度,0.0为全透明,1.0为不透明,默认为1.0
  • android:toAlpha 动画结束时的透明度,0.0为全透明,1.0为不透明,默认为1.0

当设置开始时透明度为0.0,结束时为1.0,就能实现淡入效果;相反,当设置开始时透明度为1.0,结束时为0.0,那就能实现淡出效果。示例代码如下:

<!-- res/anim/fade_in.xml --><?xml version="1.0" encoding="utf-8"?><alpha xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="1000"    android:fromAlpha="0.0"    android:toAlpha="1.0" />

将这动画效果添加到View上也只需要一行代码:

view.startAnimation(AnimationUtils.loadAnimation(this, R.anim.fade_in));

如果需要重用这个动画,也可以将其抽离出来。标签对应的动画类为AlphaAnimation,父类为Animation,以上代码将AlphaAnimation抽离后的代码可以如下:

AlphaAnimation fadeInAnimation = (AlphaAnimation) AnimationUtils.loadAnimation(this, R.anim.fade_in);view.startAnimation(fadeInAnimation);

2、scale

可以实现缩放的动画效果,主要的属性如下:

  • android:duration 动画从开始到结束持续的时长,单位为毫秒
  • android:fromXScale 动画开始时X坐标上的缩放尺寸
  • android:toXScale 动画结束时X坐标上的缩放尺寸
  • android:fromYScale 动画开始时Y坐标上的缩放尺寸
  • android:toYScale 动画结束时Y坐标上的缩放尺寸 这四个属性,0.0表示缩放到没有,1.0表示正常无缩放,小于1.0表示收缩,大于1.0表示放大
  • android:pivotX 缩放时的固定不变的X坐标,一般用百分比表示,0%表示左边缘,100%表示右边缘
  • android:pivotY 缩放时的固定不变的Y坐标,一般用百分比表示,0%表示顶部边缘,100%表示底部边缘
<?xml version="1.0" encoding="utf-8"?><scale xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="1000"    android:fromXScale="1.0"    android:fromYScale="1.0"    android:pivotX="0%"    android:pivotY="100%"    android:toXScale="1.5"    android:toYScale="1.5" />

scale标签对应的类为ScaleAnimation,父类也是Animation,在Java中用法与alpha 是一样的。

3、translate

translate 可以实现位置移动的动画效果,可以是垂直方向的移动,也可以是水平方向的移动。坐标的值可以有三种格式:从-100到100,以”%”结束,表示相对于View本身的百分比位置;如果以”%p”结束,表示相对于View的父View的百分比位置;如果没有任何后缀,表示相对于View本身具体的像素值。主要的属性如下:

  • android:duration 动画从开始到结束持续的时长,单位为毫秒
  • android:fromXDelta 起始位置的X坐标的偏移量
  • android:toXDelta 结束位置的X坐标的偏移量
  • android:fromYDelta 起始位置的Y坐标的偏移量
  • android:toYDelta 结束位置的Y坐标的偏移量

以下代码实现的是从左到右的移动效果,起始位置为相对于控件本身-100%的位置,即在控件左边,与控件本身宽度一致的位置;结束位置为相对于父控件100%的位置,即会移出父控件右边缘的位置。

<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="2000"    android:fromXDelta="-100%"    android:fromYDelta="0"    android:toXDelta="100%p"    android:toYDelta="0" />

translate标签对应的类为TranslateAnimation,父类也是Animation。

4、rotate

rotate可以实现旋转的动画效果,主要的属性如下:

  • android:duration 动画从开始到结束持续的时长,单位为毫秒
  • android:fromDegrees 旋转开始的角度
  • android:toDegrees 旋转结束的角度
  • android:pivotX 旋转中心点的X坐标,纯数字表示相对于View本身左边缘的像素偏移量;带”%”后缀时表示相对于View本身左边缘的百分比偏移量;带”%p”后缀时表示相对于父View左边缘的百分比偏移量
  • android:pivotY 旋转中心点的Y坐标,纯数字表示相对于View本身顶部边缘的像素偏移量;带”%”后缀时表示相对于View本身顶部边缘的百分比偏移量;带”%p”后缀时表示相对于父View顶部边缘的百分比偏移量

以下示例代码旋转角度从0到360,即旋转了一圈,旋转的中心点都设为了50%,即是View本身中点的位置。

<?xml version="1.0" encoding="utf-8"?><rotate xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="2000"    android:fromDegrees="0"    android:toDegrees="360"    android:pivotX="50%"    android:pivotY="50%" />

rotate标签对应的类为RotateAnimation,父类也是Animation。

5、set

set标签可以将多个动画组合起来,变成一个动画集。比如想将一张图片缩放的同时也做移动,这时候就要用 set标签组合缩放动画和移动动画了。示例代码如下:

  • android:shareInterpolator属性,设置为true时则可将interpolator应用到所有子元素中
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="2000">    <translate        android:fromXDelta="0"        android:fromYDelta="0"        android:toXDelta="200%"        android:toYDelta="0" />    <scale        android:fromXScale="1.0"        android:fromYScale="1.0"        android:pivotX="0%"        android:pivotY="100%"        android:toXScale="1.5"        android:toYScale="1.5" /></set>

以上代码实现的动画效果为向右移动的同时也同步放大。set标签在视图动画中除了可以组合alpha, scale, translate, rotate这四种标签,也可以嵌套其他set标签。

6、通用属性

上面五个标签都有android:duration属性,这是一个通用的属性,而除了android:duration,还有其他的通用属性:

  • android:duration 动画从开始到结束持续的时长,单位为毫秒
  • android:detachWallpaper 设置是否在壁纸上运行,只对设置了壁纸背景的窗口动画(window animation)有效。设为true,则动画只在窗口运行,壁纸背景保持不变
  • android:fillAfter 设置为true时,动画执行完后,View会停留在动画的最后一帧;默认为false;如果是动画集,需在标签中设置该属性才有效
  • android:fillBefore 设置为true时,动画执行完后,View回到动画执行前的状态,默认即为true
  • android:fillEnabled 设置为true时,android:fillBefore的值才有效,否则android:fillBefore会被忽略
  • android:repeatCount 设置动画重复执行的次数,默认为0,即不重复;可设为-1或infinite,表示无限重复
  • android:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:
    • restart 动画重复执行时从起点开始,默认为该值
    • reverse 动画会反方向执行
  • android:startOffset 设置动画执行之前的等待时长,毫秒为单位;重复执行时,每次执行前同样也会等待一段时间
  • android:zAdjustment 表示被设置动画的内容在动画运行时在Z轴上的位置,取值为以下三个值之一:
    • normal 默认值,保持内容在Z轴上的位置不变
    • top 保持在Z周最上层
    • bottom 保持在Z轴最下层
  • android:interpolator 设置动画速率的变化

7、interpolator

关于interpolator的各种属性我在我的博客Android动画–Interpolator的介绍已经有介绍啦,而如果系统提供的 interpolator还不符合你的效果,也可以自定义。自定义的方式有两种,一种是通过继承 Interpolator 父类或其子类;另一种是通过自定义的xml文件,可以更改系统提供的 Interpolator 的属性。自定义的xml文件需存放于res/anim/目录下。第一种自定义的方式我在博客中介绍过,所以就讲讲第二种方式。

Xml的根标签与Interpolator相应的有九种,如下:

  • <accelerateDecelerateInterpolator> 在动画开始与结束时速率改变比较慢,在中间的时候加速。没有可更改设置的属性,所以设置的效果和系统提供的一样
  • <accelerateInterpolator> 在动画开始时速率改变比较慢,然后开始加速。有一个属性可以设置加速的速率
    • android:factor 浮点值,加速的速率,默认为1
  • <anticipateInterpolator> 动画开始的时候向后然后往前抛。有一个属性设置向后拉的值
    • android:tension 浮点值,向后的拉力,默认为2,当设为0时,则不会有向后的动画了
  • <anticipateOvershootInterpolator> 动画开始的时候向后然后向前抛,会抛超过目标值后再返回到最后的值。可设置两个属性
    • android:tension 浮点值,向后的拉力,默认为2,当设为0时,则不会有向后的动画了
    • android:extraTension 浮点值,拉力的倍数,默认为1.5(2*1.5),当设为0时,则不会有拉力了
  • <bounceInterpolator> 动画结束的时候会弹跳。没有可更改设置的属性
  • <cycleInterpolator> 动画循环做周期运动,速率改变沿着正弦曲线。有一个属性设置循环次数
    • android:cycles 整数值,循环的次数,默认为1
  • <decelerateInterpolator> 在动画开始时速率改变比较快,然后开始减速。有一个属性设置减速的速率
    • android:factor 浮点值,减速的速率,默认为1
  • <linearInterpolator> 动画匀速播放。没有可更改设置的属性
  • <overshootInterpolator> 动画向前抛,会抛超过最后值,然后再返回。有一个属性
    • android:tension 浮点值,超出终点后的拉力,默认为2
<!-- res/anim/my_interpolator.xml --><?xml version="1.0" encoding="utf-8"?><anticipateOvershootInterpolator     xmlns:android="http://schemas.android.com/apk/res/android"    android:tension="3"    android:extraTension="2" />

将其设置到要应用的动画的android:interpolator属性即可:

android:interpolator="@anim/my_interpolator"

2、Property Animation

对 Property Animation 不了解的朋友可以看我的博客Android–Property Animation介绍,这里就不对Property Animation 的概念和作用做介绍啦,只讲解 Xml 里的知识。

这里要注意的是属性动画的xml文件放于res/animator/目录下,这是不能错的。

1、Animator

animator 标签与对应的ValueAnimator类提供了属性动画的核心功能,包括计算动画值、动画时间细节、是否重复等。执行属性动画分两个步骤:

  1. 计算动画值
  2. 将动画值应用到对象和属性上

ValuAnimiator只完成第一步,即只计算值,要实现第二步则需要在值变化的监听器里自行更新对象属性。通过 animator标签可以很方便的对 ValueAnimiator 进行设置,可设置的属性如下:

  • android:duration 动画从开始到结束持续的时长,单位为毫秒
  • android:startOffset 设置动画执行之前的等待时长,单位为毫秒
  • android:repeatCount 设置动画重复执行的次数,默认为0,即不重复;可设为-1或infinite,表示无限重复
  • android:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:
    • restart 动画重复执行时从起点开始,默认为该值
    • reverse 动画会反方向执行
  • android:valueFrom 动画开始的值,可以为int值、float值或color值
  • android:valueTo 动画结束的值,可以为int值、float值或color值
  • android:valueType 动画值类型,若为color值,则无需设置该属性
    • intType 指定动画值,即以上两个value属性的值为整型
    • floatType 指定动画值,即以上两个value属性的值为浮点型,默认值
  • android:interpolator 设置动画速率的变化,比如加速、减速、匀速等,需要指定Interpolator资源,这里不再重复说明

接着,用一个实例讲解具体的用法吧。在这个例子里,将一个按钮的宽度进行缩放,从100%缩放到20%。

<!-- res/animator/value_animator.xml --><?xml version="1.0" encoding="utf-8"?><animator xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="1000"    android:valueFrom="-200"    android:valueTo="200"    android:valueType="intType" />
imageView.setOnClickListener(new View.OnClickListener() {     @Override     public void onClick(View v) {         ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(                        MainActivity.this, R.animator.value_animator);        animator.setTarget(imageView);        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                        imageView.setTranslationY((Integer)animation.getAnimatedValue());            }        });        animator.start();     }});

AnimatorInflater.loadAnimator( MainActivity.this,     R.animator.value_animator);

视图动画是通过AnimationUtils类的loadAnimation()方法获取xml文件相对应的Animation类实例,而属性动画则是通过AnimatorInflater类的loadAnimation()方法获取相应的Animator类实例。

2、ObjectAnimator

objectAnimator 标签对应的类为ObjectAnimator,为ValueAnimator的子类。objectAnimator标签与animator标签不同的是,objectAnimator可以直接指定动画的目标对象的属性。标签可设置的属性除了和animator一样的那些,另外多了一个:

  • android:propertyName 目标对象的属性名,要求目标对象必须提供该属性的setter方法,如果动画的时候没有初始值,还需要提供getter方法
<!-- res/animator/object_animator.xml --><?xml version="1.0" encoding="utf-8"?><objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="1000"    android:propertyName="alpha"    android:valueFrom="0.1f"    android:valueTo="1.0f"    android:valueType="floatType" />
imageView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                ObjectAnimator animator = (ObjectAnimator) AnimatorInflater.loadAnimator(MainActivity.this,                R.animator.object_animator);                animator.setTarget(v);                animator.start();            }        });

ObjectAnimator 提供了属性的设置,但相应的需要有该属性的setter 和 getter方法。而 ValueAnimator 则只是定义了值的变化,并不指定目标属性,所以也不需要提供 setter 和 getter方法,但只能在 AnimatorUpdateListener 监听器里手动更新属性。不过,也因为没有指定属性,所以其实更具灵活性了,你可以在监听器里根据值的变化做任何事情,比如更新多个属性,比如在缩放宽度的同时做垂直移动。

为了对View更方便的设置属性动画,Android系统也提供了View的一些属性和相应的setter和getter方法:

  • alpha:透明度,默认为1,表示不透明,0表示完全透明
  • pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点
  • scaleX 和 scaleY:基于pivotX和pivotY的缩放,1表示无缩放,小于1表示收缩,大于1则放大
  • rotation、rotationX 和 rotationY:基于轴点(pivotX和pivotY)的旋转,rotation为平面的旋转,rotationX和rotationY为立体的旋转
  • translationX 和 translationY:View的屏幕位置坐标变化量,以layout容器的左上角为坐标原点
  • x 和 y:View在父容器内的最终位置,是左上角坐标和偏移量(translationX,translationY)的和

3、Set

set 标签对应于 AnimatorSet类,可以将多个动画组合成一个动画集,如上面提到的在缩放宽度的同时做垂直移动,可以将一个缩放宽度的动画和一个垂直移动的动画组合在一起。
set标签有一个属性可以设置动画的时序关系:

  • android:ordering 设置动画的时序关系,取值可为以下两个值之一:
    • together 动画同时执行,默认值
    • sequentially 动画按顺序执行

那如果想有些动画同时执行,有些按顺序执行,该怎么办呢?因为 set标签是可以嵌套其它 set标签的,也就是说可以将同时执行的组合在一个 set标签,再嵌在按顺序执行的 set标签内。

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"    android:ordering="together">    <objectAnimator        android:duration="1000"        android:propertyName="scaleY"        android:valueFrom="1.0f"        android:valueTo="2.0f"        android:valueType="floatType" />    <objectAnimator        android:duration="1000"        android:propertyName="scaleX"        android:valueFrom="1.0f"        android:valueTo="2.0f"        android:valueType="floatType" /></set>
imageView.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {       AnimatorSet animator = (AnimatorSet) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.test);       animator.setTarget(v);       animator.start();    }});

结束语:本文仅用来学习记录,参考查阅。

4 0