欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android中属性动画的基本用法(总结)

程序员文章站 2022-05-03 08:17:11
...

属性动画出现的意义:弥补补间动画的不足,实现其实现不了的效果。

属性动画的实现机制:通过对目标对象进行赋值并修改其属性来实现的。

属性动画的常用类:

(1)ValueAnimator类:对Value值进行的动画过渡效果操作类。(用的不多)

(2)ObjectAnimator类:这个是对View对象进行的动画过渡效果操作类。(重要!!!)

(3)AnimatorSet类:这是对组合动画效果的操作类。(重要!!!)

属性动画的常用动画效果:

(1)淡入淡出

JAVA代码:

ObjectAnimator animator = ObjectAnimator.ofFloat(tvEffectShow, "alpha", 1f, 0f, 1f);
animator.setDuration(3000);
animator.start();

XML(动画文件):

<?xml version="1.0" encoding="utf-8"?>
<set android:ordering="sequentially"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:valueFrom="1"
        android:valueTo="0"
        android:valueType="floatType"
        android:propertyName="alpha"/>

    <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:valueFrom="0"
        android:valueTo="1"
        android:valueType="floatType"
        android:propertyName="alpha"/>

</set>

(2)旋转效果

JAVA代码:

ObjectAnimator animator = ObjectAnimator.ofFloat(tvEffectShow, "rotation", 1f, 360f);
animator.setDuration(3000);
animator.start();

XML动画文件:

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator android:propertyName="rotation"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:valueFrom="0"
    android:valueTo="360"
    android:valueType="floatType" />

(3)移动效果

JAVA代码:

//获取组件的当前x坐标
Float transitionX = tvEffectShow.getTranslationX();
ObjectAnimator animator = ObjectAnimator.ofFloat(tvEffectShow, "translationX"
        , transitionX, -1000f, transitionX);
animator.setDuration(3000);
animator.start();

XML动画文件:(如何想上面一样,就把下面改成组合动画,参照淡入淡出的XML动画文件)

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator android:propertyName="translationX"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:valueFrom="-100"
    android:valueTo="0"
    android:valueType="floatType"/>

(4)缩放效果

JAVA代码:

ObjectAnimator animator = ObjectAnimator.ofFloat(tvEffectShow, "scaleY", 1f, 3f, 1f);
animator.setDuration(3000);
animator.start();

XML动画文件:

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator android:propertyName="scaleY"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:valueFrom="3"
    android:valueTo="1"
    android:valueType="floatType"/>

(5)组合动画效果

JAVA代码:

AnimatorSet animatorSet = new AnimatorSet();

Float transitionX = tvEffectShow.getTranslationX();
ObjectAnimator animatorTranslationX = ObjectAnimator.ofFloat(tvEffectShow, "translationX"
        , transitionX, -1000f, transitionX);

ObjectAnimator animatorScaleY = ObjectAnimator.ofFloat(tvEffectShow, "scaleY", 1f, 3f, 1f);

ObjectAnimator animatorRotation = ObjectAnimator.ofFloat(tvEffectShow, "rotation", 1f, 360f);

animatorSet.setDuration(5000);
animatorSet.play(animatorTranslationX).with(animatorScaleY).before(animatorRotation);
animatorSet.start();

XML动画文件:

<?xml version="1.0" encoding="utf-8"?>
<set android:ordering="sequentially"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <objectAnimator android:propertyName="translationX"
        android:valueType="floatType"
        android:valueFrom="-100"
        android:valueTo="0"/>

    <set android:ordering="together">

        <objectAnimator android:propertyName="scaleY"
            android:valueFrom="1"
            android:valueTo="3"
            android:valueType="floatType"/>

        <set android:ordering="sequentially">

            <objectAnimator
                android:valueFrom="1"
                android:valueTo="0"
                android:valueType="floatType"
                android:propertyName="alpha"/>

            <objectAnimator
                android:valueFrom="0"
                android:valueTo="1"
                android:valueType="floatType"
                android:propertyName="alpha"/>

        </set>

        <objectAnimator android:propertyName="scaleY"
            android:valueFrom="3"
            android:valueTo="1"
            android:valueType="floatType"/>

        <objectAnimator android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="360"
            android:valueType="floatType"/>

    </set>

</set>

XML动画文件如何创建?

在res文件夹下创建一个animator文件夹,这些动画文件应该创建在这个animator文件夹下。

XML动画文件如何使用?

//创建动画对象并加载XML动画文件
Animator animator = AnimatorInflater.loadAnimator(mContext, R.animator.anim_alpha);
//动画时长
animator.setDuration(3000);
//给View对象设置动画效果
animator.setTarget(tvEffectShow);
//开始动画效果
animator.start();

Animator动画对象如何添加监听操作?

//添加动画监听事件
animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        Toast.makeText(mContext, "动画播放完毕", Toast.LENGTH_SHORT).show();
        super.onAnimationEnd(animation);
    }

    @Override
    public void onAnimationRepeat(Animator animation) {
        Toast.makeText(mContext, "动画播放重复", Toast.LENGTH_SHORT).show();
        super.onAnimationRepeat(animation);
    }

    @Override
    public void onAnimationStart(Animator animation) {
        Toast.makeText(mContext, "动画播放开始", Toast.LENGTH_SHORT).show();
        super.onAnimationStart(animation);
    }
});

附加:

Animator对象还有一些其他方法:(在XML动画文件中设置,效果是一样的!)

setStartDelay():设置动画延迟播放的时间。

setRepeatCount():动画循环播放的次数。-1代表无限循环播放。

setRepeatMode():动画循环播放的模式。(ValueAnimator.RESTART和ValueAnimator.REVERSE两个模式,即重新播放和倒序播放两个模式)

setInterpolator():这个用于控制动画播放的速度(系统控制速度的模式比较多,需要的时候在网上查即可)。常用的匀速如下:

//匀速转动
LinearInterpolator lir = new LinearInterpolator();
animator.setInterpolator(lir);

动画播放速度的常用方法有以下几种:

我们可以在xml里面设置属性

android:interpolator="@android:anim/accelerate_interpolator" 设置动画为加速动画(动画播放中越来越快)  
  
android:interpolator="@android:anim/decelerate_interpolator" 设置动画为减速动画(动画播放中越来越慢)  
  
android:interpolator="@android:anim/accelerate_decelerate_interpolator" 设置动画为先加速在减速(开始速度最快 逐渐减慢)  
  
android:interpolator="@android:anim/anticipate_interpolator" 先反向执行一段,然后再加速反向回来(相当于我们弹簧,先反向压缩一小段,然后在加速弹出)  
  
android:interpolator="@android:anim/anticipate_overshoot_interpolator" 同上先反向一段,然后加速反向回来,执行完毕自带回弹效果(更形象的弹簧效果)  
  
android:interpolator="@android:anim/bounce_interpolator" 执行完毕之后会回弹跳跃几段(相当于我们高空掉下一颗皮球,到地面是会跳动几下)  
  
android:interpolator="@android:anim/cycle_interpolator" 循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2* mCycles* Math.PI* input)  
  
android:interpolator="@android:anim/linear_interpolator" 线性均匀改变  
  
android:interpolator="@android:anim/overshoot_interpolator" 加速执行,结束之后回弹  

然后我们在代码中也可以设置,顺序效果同上 

animation.setInterpolator(new AccelerateInterpolator());  
  
animation.setInterpolator(new DecelerateInterpolator());  
  
animation.setInterpolator(new AccelerateDecelerateInterpolator());  
  
animation.setInterpolator(new AnticipateInterpolator());  
  
animation.setInterpolator(new AnticipateOvershootInterpolator());  
  
animation.setInterpolator(new BounceInterpolator());  
  
animation.setInterpolator(new CycleInterpolator(2));  
  
animation.setInterpolator(new LinearInterpolator());  
  
animation.setInterpolator(new OvershootInterpolator());  

特别注意!!!:

一定要明白,属性动画不止上面的这几个动画样式!!!因为属性动画的本质,是通过修改目标对象的属性来实现动画效果的。那么,只要是View对象的属性,都可以进行属性动画效果的修改。

 

完整Demo地址:https://download.csdn.net/download/lpcrazyboy/10724059