Android 动画学习笔记(一)

来源:互联网 发布:网络与新媒体概论 资源 编辑:程序博客网 时间:2024/05/22 09:41

Android动画效果实现方式

逐帧动画

补间动画  -->对View进行一系列动画操作,包括淡入淡出,平移旋转

属性动画(3.0开始 √)


属性动画:


新引入的属性动画机制已经不再是针对于View来设计的了,也不限定于只能实现移动、缩放、旋转和淡入淡出这几种动画操作,同时也不再只是一种视觉上的动画效果了。它实际上是一种不断地对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性。所以我们仍然可以将一个View进行移动或者缩放,但同时也可以对自定义View中的Point对象进行动画操作了。我们只需要告诉系统动画的运行时长,需要执行哪种类型的动画,以及动画的初始值和结束值,剩下的工作就可以全部交给系统去完成了。

既然属性动画的实现机制是通过对目标对象进行赋值并修改其属性来实现的,那么之前所说的按钮显示的问题也就不复存在了,如果我们通过属性动画来移动一个按钮,那么这个按钮就是真正的移动了,而不再是仅仅在另外一个位置绘制了而已。



ValueAnimator

ValueAnimator是整个属性动画机制当中最核心的一个类,前面我们已经提到了,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。

简单用法如下

ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);  //ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 10f);anim.setDuration(300);  anim.start();  
传入0和1就表示将值从0平滑过渡到1,然后调用ValueAnimator的setDuration()方法来设置动画运行的时长,最后调用start()方法启动动画。

其他方法

ValueAnimator.ofInt()

setStartDelay()

setRepeatCount();

setRepeatMode()//RESTART重新播放 REVERSE倒序播放


ObjectAnimator

直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  animator.setDuration(5000);  animator.start();  
可操作的属性有:alpha   rotation  translationX/Y  scale(X/Y)放大等 我们可以传入任意的值到ofFloat()方法的第二个参数当中

组合动画


实现组合动画要借助AnimatorSet类,这个类提供了一个play()方法,如果向这个方法中传入一个Animator对象将会返回一个AnimatorSet。Builder的实例,其包括以下4个方法:

after(Animator anim)

after(long delay)

before(Animator anim)

with(Animator anim)

通过这4个方法,可以完成组合动画的逻辑,比如

ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);  ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  AnimatorSet animSet = new AnimatorSet();  animSet.play(rotate).with(fadeInOut).after(moveIn);  animSet.setDuration(5000);  animSet.start();  

可以看到,这里我们先是把三个动画的对象全部创建出来,然后new出一个AnimatorSet对象之后将这三个动画对象进行播放排序,让旋转和淡入淡出动画同时进行,并把它们插入到了平移动画的后面,最后是设置动画时长以及启动动画。


Animator监听


Animator类提供一个addListener()方法,接受一个AnimatorListener,实现监听。

anim.addListener(new AnimatorListener() {      @Override      public void onAnimationStart(Animator animation) {      }        @Override      public void onAnimationRepeat(Animator animation) {      }        @Override      public void onAnimationEnd(Animator animation) {      }        @Override      public void onAnimationCancel(Animator animation) {      }  });  

也可通过适配器,实现单个事件监听

anim.addListener(new AnimatorListenerAdapter() {      @Override      public void onAnimationEnd(Animator animation) {      }  });  


XML实现通用动画

具体操作如下:

如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中。然后在XML文件中我们一共可以使用如下三种标签:

  • <animator>  对应代码中的ValueAnimator
  • <objectAnimator>  对应代码中的ObjectAnimator
  • <set>  对应代码中的AnimatorSet
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"      android:valueFrom="1"      android:valueTo="0"      android:valueType="floatType"      android:propertyName="alpha"/>  

我们也可以使用XML来完成复杂的组合动画操作,比如将一个视图先从屏幕外移动进屏幕,然后开始旋转360度,旋转的同时进行淡入淡出操作,就可以这样写:

<set xmlns:android="http://schemas.android.com/apk/res/android"      android:ordering="sequentially" >        <objectAnimator          android:duration="2000"          android:propertyName="translationX"          android:valueFrom="-500"          android:valueTo="0"          android:valueType="floatType" >      </objectAnimator>        <set android:ordering="together" >          <objectAnimator              android:duration="3000"              android:propertyName="rotation"              android:valueFrom="0"              android:valueTo="360"              android:valueType="floatType" >          </objectAnimator>            <set android:ordering="sequentially" >              <objectAnimator                  android:duration="1500"                  android:propertyName="alpha"                  android:valueFrom="1"                  android:valueTo="0"                  android:valueType="floatType" >              </objectAnimator>              <objectAnimator                  android:duration="1500"                  android:propertyName="alpha"                  android:valueFrom="0"                  android:valueTo="1"                  android:valueType="floatType" >              </objectAnimator>          </set>      </set>    </set>  


最后代码中加载动画:

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  animator.setTarget(view);  animator.start();  



原创粉丝点击