android 动画之属性动画

属性动画

概述
前面给我们分析了Android中的补间动画与帧动画的用法。
android 动画之补间动画与帧动画

接下来介绍属性动画的用法。

一、属性动画与补间动画的区别

1、 补间动画只能作用于View上,如TextView、ImageView等,但是不能作用于View之外的对象上(如颜色、字体大小等)。而补间动画可以对颜色值做动画,实现更复杂的动画效果。
2、补间动画只能实现视角效果,并不能改变View的属性值。

二、属性动画的用法介绍

属性动画主要由 ObjectAnimator 类与 ValueAnimator类来实现的。

1、ObjectAnimator:是对一个对象做动画,绑定一个对象之后,会自动计算对象的属性,修改属性值。
2、ValueAnimator:是对值做动画,先算出要变化的属性值,在通过监听值变化的函数修改对象的属性。

三、属性动画的实现

对象动画(ObjectAnimator)

实现方式可以通过XML或者代码的方式实现。

方法一:XML实现对象动画:

1、在 res 目录下新建文件夹animator
2、在 animator 文件夹下创建 XML文件
XML代码如下:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="alpha"
    android:valueFrom="1"
    android:valueTo="0.1"
    android:valueType="floatType"
    android:duration="5000"
    android:repeatCount="infinite"
    android:repeatMode="reverse"
    />
<!--
alpha:透明度
开始数值
结束数值
开始与结束数值类型
持续时间
持续次数
reverse:执行完一遍后 从末位置往前执行
-->

使用 java 代码加载 xml,启动动画

	Animator animator = AnimatorInflater.loadAnimator(MainActivity.this, R.animator.animator_alpha);
    animator.setTarget(imgShow);
    animator.start();

XML 文件 的 propertyName 属性是表示动画种类的。

属性含义
alpha透明度
rotation以屏幕方向为轴的旋转
translationX / translationYX/Y方向的位移
scaleX /scaleYX/Y方向的缩放倍数
rotationX / rotationY以X/Y轴为轴的旋转
方式二:Java代码实现对象动画
	private void alphaClick(){
        // 实例化,imgShow:控件。alpha:执行动画的属性,后续为一个参数传多个值:开始,结束,结束之后状态。
        ObjectAnimator animator = ObjectAnimator.ofFloat(imgShow,
                "alpha",1f,0.1f);
        //动画延迟500ms执行
        animator.setStartDelay(100);
        // 动画执行时间
        animator.setDuration(5000);
        // 动画执行次数
        // INFINITE:无限循环执行
        animator.setRepeatCount(INFINITE);
        // 设置动画重复播放模式 RESTART -执行完一遍后重新执行
        // REVERSE -执行完一遍后 从末位置往前执行
        animator.setRepeatMode(REVERSE);
        //加速查值器,参数越大,速度越来越快
        animator.setInterpolator(new AccelerateInterpolator(5));
        //监听值变换
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Log.i("MainActivity","value:" +animation.getAnimatedValue());
            }
        });
        animator.start();
    }

值动画(ValueAnimator)

值动画通过属性值的变化,在手动赋值给对象的属性,从而实现动画。
代码如下:

        // 值动画:修改控件的属性值变化。
        ValueAnimator anim = ValueAnimator.ofFloat(1f, 0.1f);
        anim.setDuration(3000);
        anim.setRepeatCount(INFINITE);
        anim.setRepeatMode(REVERSE);
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float currentValue = (float) animation.getAnimatedValue();
                Log.d("MainActivity", "cuurent value is " + currentValue);
                // 手动将值赋予对象的属性
                imgShow.setAlpha(currentValue);
            }
        });
        anim.start();
    

PropertyValuesHolder

PropertyValuesHolder:可以将多种动画效果同时执行

		// PropertyValuesHolder:同时执行多个动画。
        PropertyValuesHolder alphaProper = PropertyValuesHolder.ofFloat("alpha", 0.5f, 1f);
        PropertyValuesHolder scaleXProper = PropertyValuesHolder.ofFloat("scaleX", 0f, 1f);
        PropertyValuesHolder scaleYProper = PropertyValuesHolder.ofFloat("scaleY", 0f, 1f);
        PropertyValuesHolder translationXProper = PropertyValuesHolder.ofFloat("translationX", -100, 100);
        PropertyValuesHolder translationYProper = PropertyValuesHolder.ofFloat("translationY", -100, 100);
        PropertyValuesHolder rotationProper = PropertyValuesHolder.ofFloat("rotation", 0, 360);
        ValueAnimator animator = ObjectAnimator.ofPropertyValuesHolder(imgShow, alphaProper,
                scaleXProper, scaleYProper,translationXProper,translationYProper,rotationProper);
        animator.setDuration(5000);
        animator.start();

AnimatorSet(组合动画)

AnimatorSet 不仅可以同时执行多个动画效果,也可以让多个动画效果按照一定的顺序执行。
AnimatorSet 需要使用的函数

函数及参数含义
play(Animator anim)要实现的动画
after(Animator anim)将play中的动画放在传入的动画之后实现
after(long delay)将play中的动画延迟指定毫秒后执行
before(Animator anim)将play中的动画放在传入的动画之前实现
with(Animator anim)将play中的动画与传入的动画同时实现

实现代码如下:

		// AnimatorSet:组合动画可以将多个动画同时执行,也可以按顺序执行。
        ObjectAnimator rotate = ObjectAnimator.ofFloat(imgShow, "rotation", 0f, 360f);
        ObjectAnimator translationX = ObjectAnimator.ofFloat(imgShow, "translationX", -100, 100f);
        ObjectAnimator translationY = ObjectAnimator.ofFloat(imgShow, "translationY", -100, 100f);
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(imgShow, "scaleX", 0, 1f);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(imgShow, "scaleY", 0, 1f);
        ObjectAnimator alpha = ObjectAnimator.ofFloat(imgShow, "alpha", 1f, 0f, 1f);
        AnimatorSet animSet = new AnimatorSet();
        animSet.play(rotate)
                .with(alpha)
                .with(scaleY)
                .after(scaleX)
                .after(1000)
                .before(translationX)
                .before(translationY);
        animSet.setDuration(5000);
        animSet.start();

动画插入器(Interpolator)

动画插入器:可以通过差值器来控制动画实现的速度。
系统默认的差值器有九种:

差值器名称效果
AccelerateInterpolator加速,开始慢中间加速
DecelerateInterpolator减速,开始快中间减速
AccelerateDecelerateInterpolator先加速后减速,开始结束慢,中间快
AnticipateInterpolator反向,先向相反方向改变在加速执行
AnticipateOvershootInterpolator反向加超越,先向相反方向,在加速,超出目标值,在缓慢移动至目标值
BounceInterpolator跳跃,快到目标值是会来回跳跃到目标值
CycleInterpolator循环,动画循环一定次数
LinearInterpolator线性,线性匀速改变
OvershootInterpolator超越,超出目标值,在缓慢移动至目标值

除了以上的系统提供的九种插入器,我们也可以自定义 Interpolator 来实现想要的效果。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值