由于补间动画只能修改显示的位置而不能改变位置,所以我们就使用属性动画。
属性动画能真正改变组件的坐标。我们通过ObjectAnimator的静态工厂方法来创建
一个ObjectAnimator对象。第一个参数是要操纵的view对象,第二个参数是要操纵的
属性,最后一个参数是一个可变数组,这个数组是记录该属性变化的一个取值过程。
注意:在使用ObjectAnimation的时候,有一点非常重要,就是你要操纵的属性
必须具有get和set方法,否则无法改变这个view对象的属性。
常用的动画效果有以下几个:
translationX和translationY这两个属性控制View对象从容器的左
上角开始的位置移动。
rotation、totationX和rotationY这三个属性控制View对象围绕支点进行2D和3D旋转。
scaleX和scaleY这两个属性控制着View对象围绕其支点进行缩放。
pivotX和pivotY这两个属性控制着View对象的支点的位置,以方便其进行旋转和缩放处理。默认情况下,该支点的位置就是View对象的中心点。
x和y代表了View对象在容器中的最终位置,它是最初的左上角坐标和translationX、translationY值的累计和。
alpha代表View对象的透明度。默认值为1不透明,0代表完全透明。
ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "属性", 属性值数组);
oa.setDuration(3000);
oa.start();
Android也提供了接口来监听动画的事件。有两个接口,一个接口是Animator.AnimatorListener,另一个接口是AnimatorListenerAdapter。
第一个接口要实现所有的方法,第二个接口只需要选择需要的事件进行监听。
oa.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
以上是给View组件设置一个属性动画,有时我们需要实现多个动画的话,就要把
这些动画组合在一起。这时我们就使用AnimatorSet这个类来实现。
代码如下:
ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "translationX", 300f);
ObjectAnimator oa2 = ObjectAnimator.ofFloat(iv, "scaleX", 1f, 0f, 1f);
ObjectAnimator oa3 = ObjectAnimator.ofFloat(iv, "scaleY", 1f, 0f, 1f);
AnimatorSet as = new AnimatorSet();
as.setDuration(1000);
as.playTogether(oa1, oa2, oa3);//三种动画一起执行
as.playSequentially(oa1, oa2, oa3);//三种动画顺序执行
as.play(oa1).with(oa2).before(oa3);//在oa3执行之前执行oa1和oa2
as.play(oa2).after(oa1);//在执行oa1之后执行oa2
as.start();
注意with、before、after放在一起会出错。其中两个放在一起可以。play是必须有的。
这是我们在代码中使用属性动画,我们也可以在xml文件中定义属性动画。
//objanimator.xml代码如下
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatCount="1"
android:repeatMode="reverse"
android:valueFrom="-100"
android:valueTo="100">
</objectAnimator>
</set>
然后在代码中引用。
Animator animator = AnimatorInflater.loadAnimator(this, R.animator.objanimator);
animator.setTarget(iv);//设置作用在哪个组件上
animator.start();
接下来介绍一下ValueAnimator,它是ObjectAnimator的父类。本身不提供动画效果,
但是通过AnimatorUpdateListener方法来监听数值的变换,从而完成动画的变换。
代码如下:
ValueAnimator va = ValueAnimator.ofFloat(0, 100);
va.setTarget(iv);//设置作用的view对象
va.setDuration(1000).start();
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
Float value = (Float) valueAnimator.getAnimatedValue();
System.out.println(value);
}
});
最后view有一种属性动画的一种简写方式,代码如下:
view.animate().alpha(0).y(300).setDuration(3000).withStartAction(new Runnable() {
@Override
public void run() {
//动画开始时
}
}).withEndAction(new Runnable() {
@Override
public void run() {
//动画结束时
}
}).start();
以上是基本的属性动画的使用。
在属性动画中,如果我们要对同一个对象的多个属性作多种动画,我们除了使用AnimatorSet,我们还可以使用PropertyValuesHolder来实现。先使用PropertyValuesHolder来定义多个属性动画,然后再使用ObjectAnimator.ofPropertyValuesHolder同时使用多属性动画。代码如下:
PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("translationX", 300f);
PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);
ObjectAnimator.ofPropertyValuesHolder(iv, pvh1, pvh2, pvh3).setDuration(1000).start();
属性动画能真正改变组件的坐标。我们通过ObjectAnimator的静态工厂方法来创建
一个ObjectAnimator对象。第一个参数是要操纵的view对象,第二个参数是要操纵的
属性,最后一个参数是一个可变数组,这个数组是记录该属性变化的一个取值过程。
注意:在使用ObjectAnimation的时候,有一点非常重要,就是你要操纵的属性
必须具有get和set方法,否则无法改变这个view对象的属性。
常用的动画效果有以下几个:
translationX和translationY这两个属性控制View对象从容器的左
上角开始的位置移动。
rotation、totationX和rotationY这三个属性控制View对象围绕支点进行2D和3D旋转。
scaleX和scaleY这两个属性控制着View对象围绕其支点进行缩放。
pivotX和pivotY这两个属性控制着View对象的支点的位置,以方便其进行旋转和缩放处理。默认情况下,该支点的位置就是View对象的中心点。
x和y代表了View对象在容器中的最终位置,它是最初的左上角坐标和translationX、translationY值的累计和。
alpha代表View对象的透明度。默认值为1不透明,0代表完全透明。
ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "属性", 属性值数组);
oa.setDuration(3000);
oa.start();
Android也提供了接口来监听动画的事件。有两个接口,一个接口是Animator.AnimatorListener,另一个接口是AnimatorListenerAdapter。
第一个接口要实现所有的方法,第二个接口只需要选择需要的事件进行监听。
oa.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
以上是给View组件设置一个属性动画,有时我们需要实现多个动画的话,就要把
这些动画组合在一起。这时我们就使用AnimatorSet这个类来实现。
代码如下:
ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "translationX", 300f);
ObjectAnimator oa2 = ObjectAnimator.ofFloat(iv, "scaleX", 1f, 0f, 1f);
ObjectAnimator oa3 = ObjectAnimator.ofFloat(iv, "scaleY", 1f, 0f, 1f);
AnimatorSet as = new AnimatorSet();
as.setDuration(1000);
as.playTogether(oa1, oa2, oa3);//三种动画一起执行
as.playSequentially(oa1, oa2, oa3);//三种动画顺序执行
as.play(oa1).with(oa2).before(oa3);//在oa3执行之前执行oa1和oa2
as.play(oa2).after(oa1);//在执行oa1之后执行oa2
as.start();
注意with、before、after放在一起会出错。其中两个放在一起可以。play是必须有的。
这是我们在代码中使用属性动画,我们也可以在xml文件中定义属性动画。
//objanimator.xml代码如下
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatCount="1"
android:repeatMode="reverse"
android:valueFrom="-100"
android:valueTo="100">
</objectAnimator>
</set>
然后在代码中引用。
Animator animator = AnimatorInflater.loadAnimator(this, R.animator.objanimator);
animator.setTarget(iv);//设置作用在哪个组件上
animator.start();
接下来介绍一下ValueAnimator,它是ObjectAnimator的父类。本身不提供动画效果,
但是通过AnimatorUpdateListener方法来监听数值的变换,从而完成动画的变换。
代码如下:
ValueAnimator va = ValueAnimator.ofFloat(0, 100);
va.setTarget(iv);//设置作用的view对象
va.setDuration(1000).start();
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
Float value = (Float) valueAnimator.getAnimatedValue();
System.out.println(value);
}
});
最后view有一种属性动画的一种简写方式,代码如下:
view.animate().alpha(0).y(300).setDuration(3000).withStartAction(new Runnable() {
@Override
public void run() {
//动画开始时
}
}).withEndAction(new Runnable() {
@Override
public void run() {
//动画结束时
}
}).start();
以上是基本的属性动画的使用。
在属性动画中,如果我们要对同一个对象的多个属性作多种动画,我们除了使用AnimatorSet,我们还可以使用PropertyValuesHolder来实现。先使用PropertyValuesHolder来定义多个属性动画,然后再使用ObjectAnimator.ofPropertyValuesHolder同时使用多属性动画。代码如下:
PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("translationX", 300f);
PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);
ObjectAnimator.ofPropertyValuesHolder(iv, pvh1, pvh2, pvh3).setDuration(1000).start();