Android动画--PropertyAnimation

在Android3.0 之后,Android引入了Property Animation的框架,弥补了一些View Animation的短板,使得我们在Android中能够更好地借助框架去实现更复杂更好的动画效果,从而创造出漂亮的用户体验。

        这一篇文章我们先来了解 一下Property Animation的一些用法。上一篇文章说到View Animation智能用在View上面,而对那些不是View的对象是不起作用的,而Property Animation则不然,它是对一切对象的一切属性都起作用,只要这个属性有对应的get/set方法。不过话虽然如此说,我个人觉得,动画效果如果我们看不到的话,那有啥意思,而能够让我们看得到的对象,基本上都是View对象,或者间接转化为View对象的。所以,我们还是来关注怎么利用Property Animation来实现View的动画效果吧。

1)translationX 和 translationY:这两个属性控制了View所处的位置,它们的值是由layout  容器设置的,是相对于坐标原点(0,0左上角)的一个偏移量。
2)rotation, rotationX 和 rotationY:控制View绕着轴点(pivotX和pivotY)旋转。
3)scaleX 和 scaleY:控制View基于pivotX和pivotY的缩放。
4)pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点。
5)x 和 y:描述了view在其父容器中的最终位置,是左上角左标和偏移量(translationX,translationY)的和。
6)aplha:透明度,1是完全不透明,0是完全透明。

现在看看如何使用吧:

1. 在XML中定义动画:
   

<?xml version="1.0" encoding="utf-8"?>
    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:propertyName="scaleX"
        android:duration="2000"
        android:valueFrom="1.0"
        android:valueTo="2.0"
        android:repeatCount="1"
        android:repeatMode="reverse">
    </objectAnimator>


    然后在java中完成
    scaleXAnimator = (ObjectAnimator)AnimatorInflater.loadAnimator(this, R.animator.scaleX);
    scaleXAnimator.setTarget(btnScaleX);

    scaleXAnimator.start();
    1)当然,首先要找到我们动画的对象了,在demo中就是那个scaleX的button了。
    2)利用AnimationInflater类的loadAnimator方法来获取我们的ObjectAnimator对象
    3)利用setTarget(View)方法来设置这个动画应用的对象,在这里就是我们的按钮了。
    4)触发动画效果,就是调用其start方法了。
    但是如果我们要在XML中定义多种效果怎么办呢?
   
<?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:ordering="together">
        <objectAnimator
            android:duration="2000"
            android:propertyName="scaleX"
            android:repeatCount="1"
            android:repeatMode="reverse"
            android:valueFrom="1.0"
            android:valueTo="2.0" >
        </objectAnimator>
        <objectAnimator
            android:duration="2000"
            android:propertyName="scaleY"
            android:repeatCount="1"
            android:repeatMode="reverse"
            android:valueFrom="1.0"
            android:valueTo="2.0" >
        </objectAnimator>
    </set>


    然后再java代码中:
    Button btnScale = (Button)findViewById(R.id.buttonScale);
    btnScale.setOnClickListener(this);
    animatorScaleSet = (AnimatorSet)AnimatorInflater.loadAnimator(this, R.animator.scale);
    animatorScaleSet.setTarget(btnScale);



    2.在Java中定义效果
   
Button buttonSet = (Button) findViewById(R.id.buttonSet);
    buttonSet.setOnClickListener(this);
    animationSet = new AnimatorSet();
    animationSet.playTogether(
    		ObjectAnimator.ofFloat(buttonSet, "alpha", 1,0,1),
    		ObjectAnimator.ofFloat(buttonSet, "translationX", 0f,400f,0f),
    		ObjectAnimator.ofFloat(buttonSet, "rotation", 0,180,360)
    		);
    animationSet.setDuration(1000);
    animationSet.addListener(new AnimatorListener() {
    	@Override
    	public void onAnimationStart(Animator arg0) {}
    	@Override
    	public void onAnimationRepeat(Animator arg0) {}
    	@Override
    	public void onAnimationEnd(Animator arg0) {}
    	@Override
    	public void onAnimationCancel(Animator arg0) {}
    });




    不过在Java中,如果要实现一个对象不同属性的动画效果,除了Set,我们还可以利用
PropertyValuesHolder和ViewPropertyAnimator对象来实现,具体做法如下:
    1.PropertyValuesHolder
    PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("translationX",0f,300f);
    PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("translationY",0f,300f);
    translateAnimator = ObjectAnimator.ofPropertyValuesHolder(buttonProValHolder, pvhX,pvhY);
    translateAnimator.setDuration(2000);

    1)我们可以通过 PropertyValuesHolder类的工厂方法ofInt, ofFloat等方法,让它能够Hold住对应property的value。
    2)在利用ObjectAnimator的ofPropertyValuesHolder方法时,再将我们上面定义的propertyValuesHolder给传进去,定义出一个objectAnimator。
    3)设置objectAnimator对应的属性,调用其Start方法就行。


    2.ViewPropertyAnimator
    button.animate().alpha(1).translationX(0f).start();
    1)先利用view的animate() 方法返回一个ViewPropertyAnimator对象,然后调用其translationX,
        alpha等方法,也可以给其添加listener。
    2)最后调用其start方法即可




    总结:
    从上面的代码中,我们可以发现,我们好像都是在用ObjectAnimator对象,
那么ValueAnimator类呢?其实ObjectAnimator是ValueAnimator的一个子类,是比较常用的一个类。
但是有时候如果ObjectAnimator不能满足我们的需求了,那么我们就要用ValueAnimator类了。
但是我们留到下一篇文章讲Property Animation的工作原理的时候再讲吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值