属性动画简介-综述

属性动画-综述

1.简介

Android3.0版本发布,用于弥补补间动画功能和扩展性方面的局限:
1.不仅可以操作view,还可以操作所有的对象
2.不仅仅是改变了view的显示效果,而且真正改变了view的属性

2.类结构

-Animator
—–ValueAnimator
———-ObjectAnimator
———-TimeAnimator
—–AnimatorSet

3.核心类ValueAnimator

  • 功能:负责管理动画的开始值和结束值的设置、播放次数、播放模式、以及对动画设置监听器等
  • 方法:
    1. SetDuration(long duration)
      设置动画总共的持续时间,以毫秒为位
    2. start()
      通过start方法可以启动动画,动画启动后不一定会立即运行。如果之前通过调用setStartDelay方法设置了动画延迟时间,那么会在经过延迟时间之后再运行动画
      在调用了start()方法之后,动画的isStarted()方法就会返回true;
      在动画真正运行起来之后,动画的isRunning()方法就会返回true,这时候动画才会调用TimeInterpolator才开始工作计算属性在某个时刻的值。调用动画的start()方法所在的线程必须绑定了一个Looper对象,如果没有绑定就会报错。当然,UI线程(即主线程)早就默认绑定了一个Looper对象,所以在主线程中我们就无需担心这个问题。如果我们想在一个View上使用属性动画,那么我们应该保证我们是在UI线程上调用的动画的start()方法。start()方法运行后会触发动画监听器AnimatorListener的onAnimationStart方法的执行。
    3. setStartDelay(long startDelay)
      可以通过调用setStartDelay方法设置动画的延迟运行时间,比如调用setStartDelay(1000)意味着动画在执行了start()方法1秒之后才真正运行,这种情况下,在调用了start()方法之后,isStarted()方法返回true,表示动画已经启动了,但是在start()方法调用后1s内,isRunning()方法返回false,表示动画还未真正运行,比如在start()方法调用后第0.5秒,由于动画还在延迟阶段,所以isRunning()返回false;在start()方法执行1秒之后,isStarted()方法还是返回true,isRunning()方法也返回了true,表示动画已经真正开始运行了。通过调用getStartDelay()方法可以返回我们设置的动画延迟启动时间,默认值是0。
    4. setInterpolator(TimeInterpolator value)
      我们可以通过调用setInterpolator方法改变动画所使用的时间插值器,由于视图动画也需要使用时间插值器,所以我们可以使用android.view.animation命名空间下的一系列插值器,将其与属性动画一起工作。通过动画的getInterpolator方法可以获取我们设置的时间插值器。
    5. setTarget(Object target)
      可以通过调用动画的setTarget方法设置其要操作的对象,这样可以更新该对象的某个属性值。实际上,该方法对于ValueAnimator作用不大,因为ValueAnimator不是直接与某个对象打交道的。setTarget方法对于ObjectAnimator作用较大,因为ObjectAnimator需要绑定某个要操作的对象,下面会详细介绍。
    6. pause()
      Android中API Level 19在Animator中加入了pause()方法,该方法可以暂停动画的执行。调用pause()方法的线程必须与调用start()方法的线程是同一个线程。如果动画还没有执行start()或者动画已经结束了,那么调用pause()方法没有任何影响,直接被忽略。当执行了pause()方法后,动画的isPaused()方法会返回true。pause()方法运行后会触发动画监听器AnimatorPauseListener的onAnimationPause方法的执行。
    7. resume()
      如果动画通过调用pause()方法暂停了,那么之后可以通过调用resume()方法让动画从上次暂停的地方继续运行。resume()方法也是从API Level 19引入的,并且调用resume()方法的线程必须与调用start()方法的线程是同一个线程。如果动画没有处于暂停状态(即isPaused()返回false),那么调用resume()方法会被忽略。resume()方法运行后会触发动画监听器AnimatorPauseListener的onAnimationResume方法的执行。
    8. end
      end()方法执行后,动画会结束运行,直接从当前状态跳转到最终的完成状态,并将属性值分配成动画的终止值,并触发动画监听器AnimatorListener的onAnimationEnd方法的执行。
    9. cancel()
      cancel()方法执行后,动画也会结束运行,但是与调用end方法不同的是,其不会将属性值分配给动画的终止值。比如一个动画在400ms内将对象的x属性从0渐变为40,当运行到第200ms时调用了cancel()方法,那么属性x的最终值是20,而不是40,这是与调用end()方法不同的,如果在第200ms调用了end()方法,那么属性x的最终值是40。调用cancel()方法后,会先触发AnimatorListener的onAnimationCancel方法的执行,然后触发onAnimationEnd方法的执行。
    10. setRepeatCount()和setRepeatMode()
      设置动画循环播放的次数以及循环播放的模式(循环模式包括RESTART和REVERSE两种,分别表示重新播放和倒序播放的意思)

4.ObjectAnimator的使用

  • ObjectAnimator是继承于ValueAnimator,故常用方法参照ValueAnimator
  • 可以对任意对象的任意属性进行操作
  • eg
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
            animator.setDuration(5000);  
            animator.start(); 
  • 说明
    参数1:控件
    参数2:view的属性(view的所有属性 如:alpha:透明度 rotation:旋转 具体可参照 view的属性说明) 后面参数:不固定长度,想要完成什么样的动画就传入什么值

5.使用AnimatorSet实现组合动画

5.1 常用方法

基本的方法和ValueAnimator的方法差不多,但是没有设置重复执行的方法,这个会在下面的5.2进行讲解,此外,还有一些比较独特的方法
- after(Animator anim) 将现有动画插入到传入的动画之后执行
- after(long delay) 将现有动画延迟指定毫秒后执行
- before(Animator anim) 将现有动画插入到传入的动画之前执行
- with(Animator anim) 将现有动画和传入的动画同时执行

5.2 重复执行组合动画

解决方法:为AnimatorSet设置监听器,在动画结束的时候再次开启,直到重复次数完成

animatorSet.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                repeatCount--;
                if(repeatCount > 0){
                    animatorSet.start();
                }
            }
        });

6.Animator的监听

animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {

            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });

或者

animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationCancel(Animator animation) {
                super.onAnimationCancel(animation);
            }
        });

若是AnimatorListener,需实现里面的所有方法

AnimatorListenerAdapter实现了AnimatorListener接口,可以在里面添加自己需要监听的方法,如onAnimationCancel()

阅读更多

没有更多推荐了,返回首页