Android动画--PropertyAnimation

来源:互联网 发布:转帖软件 编辑:程序博客网 时间:2024/05/24 00:07
在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的工作原理的时候再讲吧。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝感冒咳嗽流黄鼻涕怎么办 哺乳期感冒流清鼻涕怎么办 哺乳期打喷嚏流清鼻涕怎么办 哺乳期妈妈感冒流清鼻涕怎么办 哺乳期严重流清鼻涕怎么办 小孩每天都是脓鼻涕怎么办 夏天小孩咳嗽流黄脓鼻涕怎么办? 受凉了流清鼻涕怎么办 宝宝50多天鼻塞怎么办 50多天孩子咳嗽怎么办 2岁宝宝伤风鼻塞怎么办 2个月伤风鼻塞怎么办 3个月宝宝鼻塞怎么办 感冒治好后咳嗽一直不好怎么办 天气太热感冒了怎么办 3个月的婴儿鼻塞怎么办 四个月宝宝感冒鼻塞严重怎么办 4个月小孩鼻塞怎么办 4个多月的宝宝流鼻涕怎么办 4个月大的宝宝流鼻涕怎么办 两岁宝宝着凉了怎么办 7岁儿童晚上鼻塞怎么办 儿童感冒鼻塞怎么办速效办法 7岁儿童感冒鼻塞怎么办 七个月婴儿感冒流鼻涕怎么办 婴儿感冒流鼻涕怎么办速效办法 三个月婴儿感冒咳嗽流鼻涕怎么办 五个月婴儿感冒咳嗽流鼻涕怎么办 两个多月的宝宝鼻塞怎么办 3个月宝宝感冒鼻塞怎么办 2个月宝宝感冒鼻塞怎么办 5个月宝宝鼻塞怎么办 6个月宝宝鼻塞怎么办 3个月婴儿感冒咳嗽怎么办 感冒打喷嚏打不出来怎么办 4岁宝宝体温37.5怎么办 8个月的宝宝鼻塞怎么办 4个月婴儿鼻塞怎么办 我一躺下就鼻塞怎么办 感冒了鼻子堵了怎么办 感冒鼻涕流的多怎么办