android属性动画的使用

由于补间动画只能修改显示的位置而不能改变位置,所以我们就使用属性动画。
属性动画能真正改变组件的坐标。我们通过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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值