属性动画原理解析

属性动画属性动画的使用动画监听插值器(Interpolator)估值器(TypeEvaluator)属性动画的两个条件属性动画原理解析
摘要由CSDN通过智能技术生成

属性动画

Android中的动画分为三种:

  • View Animation 视图动画
  • Tween Animation 补间动画
  • Property Animator 属性动画

属性动画也有两种:

  • ValueAnimator 单一的属性动画(包括ObjectAnimator、TimeAnimator)
  • AnimatorSet 多个属性动画组合

属性动画的使用

属性动画可以用xml或者代码来表达,这里会选择代码的形式,比较容易理解。

属性动画的使用也不难,例如我们做一个位移属性的动画

// 设置位移动画
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationY", 0, 1000);
//设置持续时间
animator.setDuration(1500);
//设置线性时间插值器
animator.setInterpolator(new LinearInterpolator());
// 开始
animator.start();

动画监听

动画支持添加多个监听器

animator.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) {
   
        // 动画重复
    }
});

插值器(Interpolator)

  • 定义:

    利用时间流逝来换算当前的进度的百分比

  • 种类:

  1. LinearInterpolator(线性插值器):匀速动画
  2. AccelerateDecelerateInterpolator(加速减速插值器):动画开始和结束慢,中间快。
  3. DecelerateInterpolator(减速插值器):动画逐渐变慢
  • 使用:

    animator.setInterpolator(new LinearInterpolator());

估值器(TypeEvaluator)

  • 定义:

    利用进度的百分比来换算当前属性值是多少

  • 种类:

  1. IntEvaluator:针对整型属性
  2. FloatEvaluator:针对浮点型属性
  3. ArgbEvaluator:针对Color属性
  • 作用

    结合插值器获取当前的进度比,加上估值器计算出属性值,设置给作用的对象,这样表现出随着时间流逝,对象的属性值会发生不断的变化。这就是属性动画的基本原理。

    同样也可以自定义Interpolator和TypeEvaluator来自定义自己想要的动画效果。

  • 使用

    1.设置TypeEvaluator

    animator.setEvaluator(TypeEvaluator value)

    2.构造函数
    ObjectAnimator animator = Animator.ofObject(TypeEvaluator实例, 起始值, 结束值)

    默认设置为FloatEvaluator
    ObjectAnimator animator = ofFloat(Object target, String propertyName, float... values)

属性动画的两个条件

  1. 对象的类要提供set方法来修改属性值,因为属性动画就是利用反射修改对应的属性,如果对象的属性值没有初始化值,还需要提供get方法来获取属性值

  2. 修改对象属性值的set方法,UI界面应该有所变化,否则也会看不出动画效果

属性动画原理解析

ObjectAnimator初始化

从ObjectAnimator的ofFloat开始,我们看下ObjectAnimator的初始化

// ObjectAnimator.java
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) {
   
    ObjectAnimator anim = new ObjectAnimator(target, propertyName);
    anim.setFloatValues(values);
    return anim;
}

在ObjectAnimator中,有几个重要的变量

mTarget 表示作用的对象
mPropertyName 表示动画的属性名
mProperty 就是存储着属性类型和名字,跟反射有关

// ObjectAnimator
private WeakReference<Object> mTarget;
private String mPropertyName;
private Property mProperty;
private boolean mAutoCancel = false;

private ObjectAnimator(Object target, String propertyName) {
   
    setTarget(target);
    setPropertyName(propertyName);
}

这里都是设置动画的初始值

// ObjectAnimator.java
public void setFloatValues(float... values) {
   
    if (mValues == null || mValues.length == 0) {
   
        // No values yet - this animator is being constructed piecemeal. Init the values with
        // whatever the current propertyName is
        if (mProperty != null) {
   
            setValues(PropertyValuesHolder.ofFloat(mProperty, values));
        } else {
   
            setValues(PropertyValuesHolder.ofFloat(mPropertyName, values));
        }
    } else {
   
        super.setFloatValues(values);
    }
}

// ValueAnimator.java
public void setFloatValues(float... values) {
   
    if (values == null || values.length == 0) {
   
        return;
    }
    if (mValues == null || mValues.length == 0) {
   
        setValues(PropertyValuesHolder.ofFloat("", values));
    } else {
   
        PropertyValuesHolder valuesHolder = mValues[0];
        valuesHolder.setFloatValues(values);
    }
    // New property/values/target should cause re-initialization prior to starting
    mInitialized = false;
}

ObjectAnimator start()启动

属性动画启动

//ObjectAnimator
public 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android属性动画是在Android 3.0之后出现的一种强大的动画框架,它可以为几乎任何对象添加动画效果。属性动画通过在指定的时间内更改对象中的属性值来实现动画效果。与帧动画和补间动画相比,属性动画的特点是可以实现更灵活、更丰富的动画效果。属性动画可以对任意属性进行动画操作,包括Alpha(透明度)、Scale(缩放)、Rotation(旋转)和Translation(平移),甚至可以对自定义属性进行动画操作。属性动画还可以对多个属性同时进行动画操作,可以实现复杂的动画效果。总之,属性动画为开发者提供了更多自由度和创造力,使得Android应用的动画效果更加生动和丰富。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Android 属性动画原理解析](https://blog.csdn.net/mg2flyingff/article/details/112726656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【Android属性动画最全解析](https://blog.csdn.net/huweiliyi/article/details/105671079)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值