Android 属性动画原理与DataBinding

 更新时间:2017年04月11日 08:55:55   投稿:lqh  
这篇文章主要介绍了Android 属性动画原理与DataBinding的相关资料,需要的朋友可以参考下

Android 属性动画原理与DataBinding

看到这个标题的时候你可能会有疑问,属性动画和 DataBinding 之间有什么关系?我个人理解的是:它们内部的实现思想有相似之处。这篇文章主要对 Android 属性动画的知识通过文字进行整理记录,内容参考于《Android开发艺术探索》,在最后会给出我如此理解属性动画和 DataBinding 的原因。

Android动画概述:

Android 的动画可以分为三种:View 动画、帧动画和属性动画,View 动画通过对场景里的对象不断做图像变化(平移、缩放、旋转、透明度)从而产生动画效果,View 动画支持自定义。帧动画通过顺序播放一系列图像产生动画效果,可以简单理解为图片切换动画,图片过大会导致 OOM。属性动画通过动态的改变对象的属性从而达到动画效果,属性动画为API 11的新特性,在低版本需要通过兼容库来使用它。

属性动画:

属性动画可以对任意对象的属性进行动画而不仅仅是 View,在一个时间间隔内可以完成对象从一个属性值到另一个属性值的改变。因此属性动画几乎是无所不能的,只要对象有这个属性,它都能实现动画效果。、

使用:

属性动画中有 ValueAnimator 、ObjectAnimator 和 AnimatorSet 等概念,其中 ObjectAnimator 继承自 ValueAnimator,用来是实现一个属性动画,AnimatorSet 是动画集合,可以定义一组动画,它们使用起来是及其简单的,在此不再举例。属性动画除了通过代码实现以外,同View动画一样,也可以通过XML来定义,属性动画需要定义在res/animator目录下,其中的 set、objectAnimator 和 animator 标签分别对应 AnimatorSet、ObjectAnimator 和 ValueAnimator 。尽管属性动画可以通过XML来实现,但在实际开发中往往会采用代码来实现,因为很多时候一个属性的起始值是无法提前确定的。

插值器和估值器:

TimeInterpolator 译为时间插值器,它的作用是根据时间流逝的百分比来计算出当前属性值改变的百分比,系统预置的有 LinearInterpolator (线性插值器:匀速动画)、 AccelerateDecelerateInterpolator (加速减速插值器:动画两头慢中间快)和 DecelerateInterpolator (减速插值器:动画越来越慢)等。

TypeEvaluator 译为类型估值算法,也叫估值器,它的作用是根据当前属性改变的百分比来计算改变后的属性值,系统预置的有 IntEvaluator (针对整型属性)、 FloatEvaluator (针对浮点型属性)和ArgbEvaluator (针对 Color 属性)。属性动画中的插值器( Interpolator )和估值器( TypeEvaluator )很重要,它们是实现非匀速动画的重要手段。

属性动画的监听器:

属性动画提供了监听器来监听动画的播放过程,主要有AnimatorUpdateListenerAnimatorListener 。AnimatorListener 可以监听动画的开始、结束、取消以及重复播放 ,同时为了方便开发,系统还提供了 AnimatorListenerAdapter 这个类,他是 AnimatorListener 的适配器类, 可以有选择的实现这四个监听方法。AnimatorUpdateListener 比较特殊,他会监听整个动画过程, 动画是由许多帧组成的,每播放一帧对应监听方法就会被调用一次。

对任意属性做动画:

属性动画可以对任意属性添加动画效果,假如我们要给一个 button 加一个动画,让这个 button 的宽度增加 100px,我们可能会这样写:

@Override
public void onClick(View v){

   ObjectAnimator.ofInt(v,"width",100).setDuration(1000).start();

}

但是当点击按钮后并没有效果,不是说好的可以对任意属性实现动画嘛,其实没效果是对的,下面分析属性动画的原理:属性动画要求动画作用的对象提供该属性的 get 和 set 方法,属性动画根据外界传递的该属性的初始值和最终值,以动画的效果多次去调用 set 方法,每次传递给 set 方法的值都不一样,确切的来说是随着时间的推移,所传递的值越来越接近最终值。总结一下,我们对 object 的属性 abc 做动画,如果想让动画生效,要同时满足以下两个条件:

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

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

这跟 DataBinding 中的思想是一样的,这里的object对应于DataBinding中的 ViewModel,ViewModel 的成员变量 set 方法中需要提醒 DataBinding 去更新 view 的内容,如下:

  public void setName(String name) {
    this.name = name;
    notifyPropertyChanged(BR.name);

  }

针对以上问题,官方文档告诉我们有3种解决方法:

  1. 给你的对象加上 get 和 set 方法,如果有权限的话
  2. 用一个类来包装原始对象,间接为其提供 get 和 set 方法
  3. 采用 ValueAnimator,监听动画过程,自己实现属性的改变

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Android自定义View实现数字雨效果的全过程

    Android自定义View实现数字雨效果的全过程

    小时候看时印象最深的就是数字雨了,导致我现在写代码也要是黑屏,下面这篇文章主要给大家介绍了关于Android自定义View实现数字雨效果的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 基于Manifest.xml中不要出现重复的uses permission的说明

    基于Manifest.xml中不要出现重复的uses permission的说明

    本篇文章对Manifest.xml中不要出现重复的uses permission进行了介绍。需要的朋友参考下
    2013-05-05
  • Android中Messenger原理及基本用法详解

    Android中Messenger原理及基本用法详解

    这篇文章主要为大家详细介绍了Android中Messenger原理及基本用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Android自定义View绘制彩色圆弧

    Android自定义View绘制彩色圆弧

    这篇文章主要为大家详细介绍了Android自定义View绘制彩色圆弧,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Android实现系统打印功能

    Android实现系统打印功能

    这篇文章主要为大家详细介绍了Android实现系统打印功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Android自定义带动画效果的圆形ProgressBar

    Android自定义带动画效果的圆形ProgressBar

    这篇文章主要为大家详细介绍了Android自定义带动画效果的圆形ProgressBar,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Android 静默安装实现方法

    Android 静默安装实现方法

    这篇文章主要介绍了Android 静默安装实现方法的相关资料,静默安装的方法,静默安装就是绕过安装程序时的提示窗口,直接在后台安装,需要的朋友可以参考下
    2017-04-04
  • Android中SoundPool的使用步骤实例

    Android中SoundPool的使用步骤实例

    今天小编就为大家分享一篇关于Android中SoundPool的使用步骤实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Android应用中加入微信分享简单方法

    Android应用中加入微信分享简单方法

    这篇文章主要介绍了Android应用中加入微信分享简单方法,本文用简洁明快的步骤讲解了加入微信分享的方法,需要的朋友可以参考下
    2015-05-05
  • Android软键盘遮挡的四种完美解决方案

    Android软键盘遮挡的四种完美解决方案

    输入密码时输入框被系统键盘遮挡了,大大降低了用户操作体验,在开发中如何解决软键盘遮挡问题呢,下面小编给大家带来了四种android软键盘遮挡问题,感兴趣的朋友一起学习吧
    2016-10-10

最新评论