Android动画-属性动画

一、属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据你传递的该熟悉的初始值和最终值,以动画的效果多次去调用set方法,每次传递给set方法的值都不一样,确切来说是随着时间的推移,所传递的值越来越接近最终值。总结一下,你对object的属性xxx做动画,如果想让动画生效,要同时满足两个条件:

  1. object必须要提供setXxx方法,如果动画的时候没有传递初始值,那么还要提供getXxx方法,因为系统要去拿xxx属性的初始值(如果这条不满足,程序直接Crash)

  2. object的setXxx对属性xxx所做的改变必须能够通过某种方法反映出来,比如会带来ui的改变啥的(如果这条不满足,动画无效果但不会Crash)

  3. 通过ObjectAnimator的静态工厂方法,创建一个ObjectAnimator对象。第一个参数是需要操控的View,第二个参数是要操作的属性。而最后一个参数是一个可变数组参数,需要传进去该属性变化的一个取值过程。

1、属性动画:拉伸
拉伸属性:
width
height

/**
     * 属性动画:拉伸
     */
    public void strchView(){
        ObjectAnimator.ofInt(button, "width", 700).setDuration(3000).start();

    }

2、属性动画:旋转
旋转属性:
rotation
rotationX
rotationY

/**
     * 属性动画:旋转
     */
    public void rotateView(){
        ObjectAnimator.ofFloat(button, "rotationY", 0.0f, 360).setDuration(300).start();
    }

3、位移:
translationX
translationY

  ObjectAnimator.ofFloat(imageView, "translationX", 0.0f, 300.0f).setDuration(3000).start();

4、缩放:
scaleX
scaleY

 ObjectAnimator.ofFloat(imageView, "scaleX",0.0f, 2.0f).setDuration(3000).start();
        ObjectAnimator.ofFloat(imageView, "scaleY",0.0f, 2.0f).setDuration(3000).start();

当一个属性没有get、set方法时,有两种方案可以选择:
一、通过自定义一个属性类或者包装类。来间接的给这个属性增加set、get方法。

public static class WrapperView {
    private View mTarget;

    public WrapperView(View mTarget) {
        this.mTarget = mTarget;
    }
    public int getWidth(){
        return mTarget.getLayoutParams().width;
    }

    public void setWidth(int width){
        mTarget.getLayoutParams().width = width;
        mTarget.requestLayout();
    }

}

使用时操作包装类就可以调用set、get方法。

二、通过ValueAnimator来实现。
ObjectAnimator继承自ValueAnimator.
ValueAnimator本身不提供任何动画效果,它更像一个数值发生器,用来产生具有一定规律的数字,从而来控制动画的实现过程。

  ValueAnimator valueAnimator = ValueAnimator.ofFloat(0.0f, 100.0f);
        valueAnimator.setTarget(imageView);
        valueAnimator.setDuration(3000).start();
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Float value = (Float) animation.getAnimatedValue();

            }
        });

二、PropertyValuesHolder
类似于AnimatorSet,在属性动画中,如果针对同一个属性的同一个对象的多个属性,要同时作用于多种动画,可以使用PropertyValuesHolder来实现。

PropertyValuesHolder x = PropertyValuesHolder.ofFloat("scaleX", 0.0f, 2.5f);
        PropertyValuesHolder y = PropertyValuesHolder.ofFloat("scaleY", 0.0f, 3.0f);
        ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(imageView, x, y);
        animator.setDuration(3000);
        animator.start();

三、动画事件的监听

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值