动画

属性动画篇

ValueAnimator(对值进行平滑的过渡)
  • 属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责的。
  • 内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。
  • ValueAnimator负责动画的播放次数、播放模式、动画设置监听器。
    // 1.数值从0变化到1
    ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
    // 2.数值从0变化到5,然后变到3,最后变到10
    ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 10f);
    anim.setDuration(3000); -- 设置动画时间3s
    anim.setStartDelay(); -- 设置动画延迟播放的时间
    anim.setRepeatCount(); -- 设置动画循环播放的次数
    anim.setRepeatMode(); -- 设置循环播放的模式,包括RESTART(重复播放)和REVERSE(倒序播放)
    // 设置监听事件
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){
        @Override
        public void onAnimationUpdate (ValueAnimator animation){
            // 此处的值就是ofFloat()中的值
            float currentValue = (float) animation.getAnimatedValue();
        }
    });
    anim.start();~~~


##### ObjectAnimator
- 继承自ValueAnimator
/**
 * 将文字平移出屏幕再平移回来
* ofFloat():参数值可以放那些东西?
*     -- 我们可以传入任意的值到第二个参数中
*     -- 动画改变的不是translationX这个值,因为textview中没有设置属性
*     -- 动画改变的其实是getTranslationX()方法
*/
float curTranslationX = textview.getTranslationX();
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX, -500f, curTranslationX);
animator.setDuration(5000);
animator.start();~~~
组合动画 -- AnimatorSet
    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();~~~


##### Animator监听器
// ObjectAnimator和ValueAnimator都可以使用addListener()方法
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) {}
});

// 使用此Adapter可以不用实现以上的所有方法
anim.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {}
});  ~~~
使用XML编写动画
  • 通过XML来编写动画可能比通过代码来编写要慢,但是重用的时候会非常轻松,比如将通用的动画编写到XML里面。
  • 编写属性动画,需要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹中。在XML中我们一共可以使用如下的三种标签。

:对应代码中的ValueAnimator
:对应代码中的ObjectAnimator
:对应代码中的AnimatorSet

    // 实现一个从0到100平滑过渡的动画
     ~~~

// 将试图的alpha属性从1变为0
  ~~~
    // 将视图从屏幕外移进屏幕,然后开始旋转360度,旋转的同时进行淡入淡出操作
     -- 顺序进行

        
        

         -- 同时进行
            
            

            
                
                
                
                
            
        
    ~~~

// 在代码中调用xml,loadAnimator()
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view); -- 将这个动画设置到对象上
animator.start(); ~~~

你可能感兴趣的:(动画)