你的位置:首页 > 软件开发 > 操作系统 > Android动画基础——属性动画(Property Animation)

Android动画基础——属性动画(Property Animation)

发布时间:2016-06-21 19:00:05
本篇涉及例子下载:Github本篇讲android 3.0引入的属性动画框架,上篇写视图动画View Animation时就说过ViewAnimation的缺点,那就是动画作用的是view本身的视觉部分,view实际属性并没有随着动画的改变而变化。很多时候就需要额外去出来由于动画 ...

Android动画基础——属性动画(Property Animation)

本篇涉及例子下载:Github

本篇讲android 3.0引入的属性动画框架,上篇写视图动画View Animation时就说过ViewAnimation的缺点,那就是动画作用的是view本身的视觉部分,view实际属性并没有随着动画的改变而变化。很多时候就需要额外去出来由于动画引起的事件不同步,比如ViewAnimation已经讲View移出了屏幕,但View的事件触发还在原地,这就需要额外处理了。 但是,PropertyAnimation的引入就完全解决了这个问题,它可以保证动画和事件的变化总是一起的发生的。其本质是View是属性变化带动View重绘来完成动画。

目录

  • 属性动画框架结构
  • 个人理解
  • TypeEvaluator与Interpolators
  • ObjectAnimator
  • ValueAnimator
  • 动画集: Keyframes于AnimatorSet

一、属性动画框架结构

个人觉得了解继承结构对学习框架帮助挺大的,所以开始先说一下属性动画的框架,我自己用StartUML画了下面的类图: Android动画基础——属性动画(Property Animation) 画得比较糙(StartUML用的不好, -_-!),上面没画出TypeEvaluator和Interpolator,一来是怕复杂了不好看重点信息,二来是后面会重点讲。大致讲一下各个类的作用:

  • Animator类:属性动画框架的基类,封装了动画时间、**、动画状态的控制。
  • AnimatorListener:动画状态接口,封装了不同状态需要调用的方法,有如下方法
    • onAnimationStart() - 动画开始时调用
    • onAnimationEnd() - 动画结束时调用
    • onAnimationRepeat() - 动画重复时调用
    • onAnimationCancel() - 动画取消时调用,注意这个方法调用后会接着调用onAnimationEnd()
  • AnimatorSet:类似于视图动画中的AnimationSet,它代表了一个动画集,可以指定动画集中各个动画的顺序,是实现复杂动画必不可少的利器。
  • ValueAnimation:属性动画的核心类,它能驱动View的属性变化进而实现动画。
  • AnimationUpdateListenr:与ValueAnimation搭配使用,每次需要刷新动画帧时会调用这个接口里的方法,进而对真正的View设置属性完成动画。它就包含一个接口方法:
    • onAnimationUpdate()
  • ObjectAnimator:ValueAnimator的便捷版本,也是平时使用最多的属性动画类,它通过反射调用自动完成View属性的设置,非常简单。
  • TimeAnimator:可是用于同步动画的辅助类,可以在触发动画帧时通过接口让动画执行指定的时间点。

以上便是属性动画框架的大致结构,关于ypeEvaluator和Interpolator后面有讲到。

二、个人理解

1.属性动画时“真正的”动画机制吗? 我觉得不是(放下手头的砖,让我说完 ㄟ( ▔, ▔ )ㄏ),为什么我说不是?它并不是直接生成一段动画,它是通过在众多动画帧上改变View的属性,然后View重绘,进而达到动画的目的。或者把它理解成一个过渡值产生器更合适,它在每个动画帧时间点上产生一个过渡值,然后把这个值设为相应的属性。 2.属性动画VS视图动画: 属性动画相比于视图动画的优点是显而易见的,因为动画的来源是由于View的属性变化引起的重绘,所以不存在事件与动画不一致的情况。 视图动画最大的优点就是它简单了,不需要添加各种**就能实现动画。 我还没有两种动画性能的对比,不知道在实现相同效果时孰优孰劣,所以不敢妄下结论。留到后面讨论吧! 3.ValueAnimator VS ObjectAnimator ObjectAnimator是ValueAnimator的便捷类,为了避免复杂的实现尽量选择用ObjectAnimator。

三、TypeEvaluator与Interpolators

前面多次说道动画帧(Frame),什么叫Frame呢?相当于视图动画中的帧动画,也就是每一个单独的页面,类似于胶卷电影中的一格。人眼的可察觉刷新频率是24帧每秒,在低于这个频率的动画中我们看到影像就不是连续的。而熟悉动画中用来指定动画刷新频率的是setFrameDelay()方法,默认情况下它的值是10ms,也就是100帧每秒。有了刷新频率,如何讲它映射到值呢?这就要用到TypeEvaluator和Interpolators了! 先说Interpolators(插值器):它的总用是怎样将一个时间分数装换为一个值分数,两者的相对关系体现了动画的形式:匀速、加速、先加速后减速,或者其它的数学变换。怎么理解讲一个时间分数装换为值分数呢?来看一下接口吧!所以插值器都是TimeInterpolator接口的子类,其中声明的方法:

abstract float getInterpolation(float input)
ps:这符图不是很严谨,因为有些内容是不好表达,比如动画帧的计时是连续的,并不是等到上一帧完成了才开始计数下一帧。其次就是Animator本身的Listener是班法画上去的,当Animator调用cance(),end()之类的方法是能打断这个流程的。但是这图对理解过程还是不错的。

四、ObjectAnimator

先来讲最常使用的属性动画,ObejectAnimator,通过置顶好动画作用对象个对用属性等设置值后,ObjectAnimator能够通过反射区设置对象属性达到动画的目的。 ObjectAnimator提供了四种静态方法来构造自己的对象,分别是:ofInt、ofFloat、ofArgb、ofObject 。它们动画的值类型正如名字中说的那样,如ofInt动画作用于一个int域,offArgb注意与一个带透明的颜色域。 来看一个用动画改变栏背景的例子

public class MainActivity extends AppCompatActivity {  @Bind(R.id.btn_bg) Button mGradientBg;  ObjectAnimator mAnimator;  @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    final View view = findViewById(android.R.id.content);    final Drawable bgd =view.getBackground();    mAnimator = ObjectAnimator.ofArgb(view,"backgroundColor",0x881DDA38,0x88D48AB2);    mAnimator.setDuration(5*1000);    mAnimator.setRepeatMode(ObjectAnimator.REVERSE);    mAnimator.addListener(new AnimatorListenerAdapter() {      @Override public void onAnimationEnd(Animator animation) {        super.onAnimationEnd(animation);        view.setBackground(bgd);      }    });    ButterKnife.bind(this);  }  @OnClick(R.id.btn_bg) void onGradientActionbarClicked() {    mAnimator.start();  }}
上面就是ObjectAnimation使用过程,先通过四个静态方法构造出一个ObjectAnimation对象,这里使用的是ofArgb:

static ObjectAnimator  ofArgb(Object target, String propertyName, int... values)

原标题:Android动画基础——属性动画(Property Animation)

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录