温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android应用中实现属性动画的原理是什么

发布时间:2020-12-02 17:12:03 来源:亿速云 阅读:143 作者:Leah 栏目:移动开发

今天就跟大家聊聊有关Android应用中实现属性动画的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

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应用中实现属性动画的原理是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI