这一篇文章我们先来了解 一下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的工作原理的时候再讲吧。