一,View Animation

View Animation是Android早期的动画系统,它包括Tween Animation以及Frame Animation
1. Tween Animation: 补间动画,使用资源定义的时候放到res/anim目录
2. Frame Animation:帧动画,使用资源定义的时候放到res/drawable目录。可以直接指定为某个ImageView的android:src,适合用来做各种loading动画。

二,Property Animation

与View Animation的区别

  1. View Animation只能应用于View对象,Property Animation可以应用于任何Object。而且View Animation只能改变View的一部分特征,例如大小位置旋转角度和透明度。
  2. View Animation只修改View的draw,实际上其属性并没有改变。例如将一个Button移动到另外的位置,但是它的点击响应区域还是原来的地方。
  3. 如果你的需求能用View Animation实现的话也无妨,因为View Animation更容易写。

关键类:

ValueAnimator, ObjectAnimator, AnimatorSet
* ValueAnimator: Property Animator的实现主要包括两个方面:一是根据start value, end value和interpolator,将elapsed fraction转化为interpolated fraction(对于使用线性interpolator的Animator来说,elapsed fraction和interpolated fraction是一样的)。二是将计算出来的interpolated fraction应用到对象的property中。ValueAnimator正是用于实现第一个步骤的。
* ObjectAnimator: ValueAnimator的子类,它可以同时负责Property Animator的两个任务。所以更多时候我们直接用它来实现动画,但是它的限制也更多。项目中一般直接用这个的居多,简单方便。
* AnimatorSet: 用于组合多个Animator来实现复杂动画。
* Animator.AnimatorListener -> AnimatorListenerAdapter简化
ValueAnimator.AnimatorUpdateListener

示例

1,使用ObjectAnimator

private void animateWithObjectAnimator() {    PropertyValuesHolder alphaHolder = PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.0f);    PropertyValuesHolder scaleXHolder = PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f);    PropertyValuesHolder scaleYHolder = PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f);    PropertyValuesHolder xHolder = PropertyValuesHolder.ofFloat("x", 0.0f, 800.0f);    ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(targetView,            alphaHolder, scaleXHolder, scaleYHolder, xHolder);    animator.setInterpolator(new AccelerateInterpolator());    animator.setDuration(1000);    animator.start();}

2,使用ValueAnimator

private void animateWithValueAnimator() {    PropertyValuesHolder alphaHolder = PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.0f);    PropertyValuesHolder scaleXHolder = PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f);    PropertyValuesHolder scaleYHolder = PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f);    PropertyValuesHolder xHolder = PropertyValuesHolder.ofFloat("x", 0.0f, 800.0f);    ValueAnimator animator = ValueAnimator.ofPropertyValuesHolder(alphaHolder,            scaleXHolder, scaleYHolder, xHolder);    animator.setInterpolator(new AccelerateInterpolator());    animator.setDuration(1000);    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {        @Override        public void onAnimationUpdate(ValueAnimator valueAnimator) {            targetView.setAlpha((Float) valueAnimator.getAnimatedValue("alpha"));            targetView.setScaleX((Float) valueAnimator.getAnimatedValue("scaleX"));            targetView.setScaleY((Float) valueAnimator.getAnimatedValue("scaleY"));            targetView.setX((Float) valueAnimator.getAnimatedValue("x"));        }    });    animator.start();}

可知实现同样的效果,使用ObjectAnimator更简单。

3,将动画定义在resource中(res/animator目录)有利于重用:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <objectAnimator  android:propertyName="x" android:valueFrom="0dp" android:valueTo="250dp" android:valueType="floatType" android:repeatMode="reverse" android:repeatCount="-1" android:duration="2000" />    <objectAnimator  android:propertyName="alpha" android:valueFrom="1.0" android:valueTo="0.5" android:valueType="floatType" android:repeatMode="reverse" android:repeatCount="-1" android:duration="1000" />    <objectAnimator  android:propertyName="scaleX" android:valueFrom="1.0" android:valueTo="0.5" android:valueType="floatType" android:repeatMode="reverse" android:repeatCount="-1" android:duration="1000" />    <objectAnimator  android:propertyName="scaleY" android:valueFrom="1.0" android:valueTo="0.5" android:valueType="floatType" android:repeatMode="reverse" android:repeatCount="-1" android:duration="1000" /></set>

使用

AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.stone_beat);animatorSet.setTarget(targetView);animatorSet.start();

高端用法:

  1. keyframe定义动画的多个阶段
  2. 自定义Interpolator实现复杂的动画路径

三,ViewPropertyAnimator (API12)

PropertyAnimator的优化版,其优势为:
1,PropertyAnimator使用反射来获取/设置Object的property,ViewPropertyAnimator完成没有使用反射与JNI。
2,当对同一个View并行设置多个property的时候,ViewPropertyAnimator只invalidate一次。如果用多个PropertyAnimator设置View的多个property,则每次更新会执行多次invalidate导致浪费。
3,写法更简练,例如:

targetView.animate()          .setInterpolator(new AccelerateDecelerateInterpolator())          .setDuration(1000)          .x(700)          .setStartDelay(200)          .rotation(720);

这段代码动画是把targetView向右移动700像素的同时旋转720度。如果用Property Animation来作的话,需要这样写:

PropertyValuesHolder rotationHolder = PropertyValuesHolder.ofInt("rotationX", 0, 720);PropertyValuesHolder xHolder = PropertyValuesHolder.ofFloat("x", 0.0f, 700.0f);ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(targetView,                        rotationHolder, xHolder);animator.setInterpolator(new AccelerateInterpolator());animator.setStartDelay(200);animator.setDuration(1000);animator.start();

可见,ViewPropertyAnimator的代码量少了很多而且更易懂。

如果需要在动画的各个阶段进行不同的处理,可以这样:

targetView.animate().rotation(720).setListener(new Animator.AnimatorListener() {    ...});

setListener有一个需要注意的地方,因为每次targetView.animate()返回的是同一个Animator,所以对targetView有多次动画调用例如进入页面时执行一个begin动画退出页面时执行一个end动画。如果在begin的时候设置了listener,则在end的各个阶段里这个listener的callback都会被执行!所以,当不需要监听动画的各个阶段时执行一个.setListener(null)是一个好习惯。

在API16之后,可以更容易的动画的开始和结束加入处理事件:

targetView.animate().rotation(720).withStartAction(new Runnable() {    @Override    public void run() {        Log.d(TAG, "ViewPropertyAnimation start");    }}).withEndAction(new Runnable() {    @Override    public void run() {        Log.d(TAG, "ViewPropertyAnimation end");    }});

更多相关文章

  1. 跨平台移动开发 Android使用JPush推送消息
  2. Android(安卓)使用 TableLayout 布局拉伸宽度
  3. Android(安卓)4高级编程(第3版)》
  4. GridView的简单使用,带有点击事件
  5. Android(安卓)Dialog的使用
  6. android之ListView和SimpleAdapter的组合使用
  7. android shape的使用
  8. 《第一行代码——Android》
  9. ubuntu 使用android studio 查看android(android-5.1.0_r3)源码

随机推荐

  1. Android存储选项简析
  2. Android(安卓)RenderScript 的使用基础篇
  3. Android高人必修 Ant 编译Android工程
  4. Android(安卓)40个面试点
  5. Android绘图之XML绘图
  6. Android(安卓)8.0 学习(4)---Android通用内
  7. Android智能指针
  8. Java中的WeakReference 和 SoftReference
  9. Android开发实践:线程与异步任务
  10. Android(安卓)RxJava:一步步带你源码分析