属性动画

2017-01-18  本文已影响0人  ZzzRicardo_Yue

整理自:
http://blog.csdn.net/guolin_blog/article/details/43536355


三类动画:
补间动画
属性动画
帧动画(一张一张图片轮播,有可能会OOM,而且很简单,这里不讲了)

1、属性动画(property animation)

为啥用属性动画不用补间动画:

1-1、ValueAnimator

设置数值上的平滑增加会减小

ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);  
anim.setDuration(300);  
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  
    @Override  
    public void onAnimationUpdate(ValueAnimator animation) {  
        float currentValue = (float) animation.getAnimatedValue();  
        Log.d("TAG", "cuurent value is " + currentValue);  
    }  
});  
anim.start();  

用addUpdateListener()方法来添加一个动画的监听器
运行结果:


Paste_Image.png

将一个值在5秒内从0过渡到5,再过渡到3,再过渡到10的代码:

ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 10f);  
anim.setDuration(5000);  
anim.start();  

其他简单的设置:

1-2、ObjectAnimator

1-2-1、动画举例

ObjectAnimator可以直接对任意对象的任意属性进行动画操作,比如说View的alpha属性。
因为ObjectAnimator其实是继承自ValueAnimator的,说明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它们的用法也非常类似。

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
animator.setDuration(5000);  
animator.start();  
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  
animator.setDuration(5000);  
animator.start();  
float curTranslationX = textview.getTranslationX();  //getTranslationX()方法来获取到当前TextView的translationX的位置
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX, -500f, curTranslationX);  
animator.setDuration(5000);  
animator.start();  
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);  
animator.setDuration(5000);  
animator.start();  

这里注意如果要对一个View进行缩放,这样做是没用的(好像不能直接对"scale"进行操作),要分别对"scaleY"和"scaleX"进行操作:

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scale", 1f, 3f, 1f);  

效果:


缩放

ofFloat()的第二个参数除了上述这些还有哪些呢?
其实ObjectAnimator内部的工作机制并不是直接对我们传入的属性名进行操作的,而是会去寻找这个属性名对应的get和set方法,因此alpha属性所对应的get和set方法应该就是:

public void setAlpha(float value);  
public float getAlpha(); 

textview对象的确有这两个方法,并且这两个方法是由View对象提供的,也就是说不仅TextView可以使用这个属性来进行淡入淡出动画操作,任何继承自View的对象都可以的。

1-2-2、组合动画

注意这个组合动画的做法也适用于ValueAnimator!

借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:

Eg:让TextView先从屏幕外移动进屏幕,然后开始旋转360度,旋转的同时进行淡入淡出操作

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();  
1-2-3、动画监听

注意这个动画监听的做法也适用于ValueAnimator!

我们希望可以监听到动画的各种事件,比如动画何时开始,何时结束,然后在开始或者结束的时候去执行一些逻辑处理。
Animator类当中提供了一个addListener()方法,这个方法接收一个AnimatorListener,我们只需要去实现这个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) {  
    //在动画被取消的时候调用
    }  
});  

也可以使用适配器类AnimatorListenerAdapter来实现这四个方法中的任意一个方法,免得每次都要将四个接口全部实现一遍(假设只想要在动画结束之后设定一些逻辑):

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

因为

1-2-4、使用XML编写动画

通过XML来编写动画可能会比通过代码来编写动画要慢一些,但是在重用方面将会变得非常轻松,比如某个将通用的动画编写到XML里面,我们就可以在各个界面当中轻松去重用它。
如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中。然后在XML文件中我们一共可以使用如下三种标签:

  • 从0到100平滑过渡的动画:
<animator xmlns:android="http://schemas.android.com/apk/res/android"  
    android:valueFrom="0"  
    android:valueTo="100"  
    android:valueType="intType"/>  
  • 将一个视图的alpha属性从1变成0
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"  
    android:valueFrom="1"  
    android:valueTo="0"  
    android:valueType="floatType"  
    android:propertyName="alpha"/>  
  • 复杂的组合动画操作,比如将一个视图先从屏幕外移动进屏幕,然后开始旋转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>  

在代码中将xml动画加载进来:

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
animator.setTarget(view);   //setTarget()方法将这个动画设置到某一个对象上面
animator.start(); 

2、补间动画

概述:对View进行移动、缩放、旋转和淡入淡出,并且我们还可以借助AnimationSet来将这些动画效果组合起来使用,除此之外还可以通过配置Interpolator来控制动画的播放速度

上一篇下一篇

猜你喜欢

热点阅读