Android动画详解(三) 属性动画

1、属性动画说明

1.1概念

属性动画是Android 3.0版本开始提供,对补间动画的缺陷做了弥补,几乎完全可以代替掉补间动画。

1.2 相对于补间动画的优势

  1. 补间动画只能作用于View对象或其他任何继承自View的控件,当自定义View中onDraw()方法中绘制image,想对image进行动画操作,补间动画无法实现。
  2. 补间动画实现的动画效果有限,只能实现移动、缩放、旋转和淡入淡出这四种。
  3. 补间动画只是改变了View的显示效果,并没有对View的属性进行实际修改。

1.3 属性动画实现原理

属性动画实际上是采用一种不断对值进行操作的机制,并将不断变化的值赋值到指定对象的指定属性上。我们只需要设置动画类型、动画初始值、动画结束值。

2、代码实现

2.1 ValueAnimator

2.1.1 基本用法
ValueAnimator animator = ValueAnimator.ofFloat(0f,1f);
                animator.setDuration(500);
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        float currentValue = (float) animation.getAnimatedValue();
                        L.d("TGA","当前值:"+currentValue);
                    }
                });
                animator.start();
2.1.2 值变化效果

这里写图片描述

2.1.3 其他方法
//设置持续时间
animator.setDuration(500);
//设置延迟播放
animator.setStartDelay(100);
//设置循环播放次数
animator.setRepeatCount(10);
//设置循环播放模式
animator.setRepeatMode(ValueAnimator.RESTART);
//设置当前播放时间,想到于播放进度选择
animator.setCurrentPlayTime(1000);

2.2 ObjectAnimator

2.2.1 基本用法

ObjectAnimator继承自ValueAnimator,可以直接作用于任意对象的任意属性

ObjectAnimator animator = ObjectAnimator.ofFloat(anim_iv,"alpha",1f,0f,1f);
               animator.setDuration(3000);
               animator.start();
2.2.2 ofFloat()方法参数说明
ofFloat(java.lang.Object target,java.lang.String propertyName,float... values)
  1. ofFloat返回一个ObjectAnimator 实例。
  2. 第一个参数为一个Object,这个Object应该有一个公共方法来对象的动画属性进行操作
  3. 第二个参数为要操作的动画属性名称
  4. 一组动态数组值,动画将按造时间和数组值进行动画播放
2.2.3 效果演示

这里写图片描述

2.2.4 propertyName参数说明

propertyName传入的值可以是任意字符串,ObjectAnimator 通过反射来调用propertyName对应的get、set方法,因为View中包含getRotation()、setTranslationX()、getTranslationX()、setScaleY()、getScaleY()所以能识别rotation,translationX等字符串,对于识别不了的字符串可以通过设置监听来获取变化值自己进行动画设置。

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        float value = (float) animation.getAnimatedValue();
                    }
                });
2.2.5 Animator监听

监听全部接口

 animator.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                       //动画开始监听
                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                       //动画结束监听
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {
                       //取消动画监听
                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {
                      //重复执行监听
                    }
                });

使用适配器监听单个接口

animator.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                        super.onAnimationStart(animation);
                    }
                });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值