Android动画学习总结

来源:互联网 发布:linux 电池驱动 编辑:程序博客网 时间:2024/06/05 18:04

Android动画学习总结

一、Android动画分类:

  • View动画:场景里的View不断的做变换(平移、旋转、拉伸、透明度)产生的动画效果;
  • 帧动画:按顺序播放一系列图像产生的效果;
  • 属性动画:Android3.0开始增加的一种动画效果,通过动态改变View对象的属性值实现。

二、View动画:

  • View动画分为TranslateAnimation、RotateAnimation、ScaleAnimation、AlphaAnimation四类,每一类都有其各自的属性,具体可以查看官方文档,强烈建议使用XML来定义View动画,简单方便,可读性高,下面说明四类动画在XML中的表现形式:

    • TranslateAnimation—<translate>
    • RotateAnimation—<rotate>
    • ScaleAnimation—<scale>
    • AlphaAnimation—<alpha>
  • 下面是View动画的定义://res.anim.customize_anim.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"     android:interpolator="@android:anim/accelerate_decelerate_interpolator"     android:duration="3000"     android:repeatMode="reverse"     android:fillAfter="true"     android:startOffset="300"     android:shareInterpolator="true">    <translate            android:fromYDelta="100"            android:fromXDelta="100"            android:toYDelta="500"            android:toXDelta="500" />    <rotate            android:fromDegrees="0"            android:toDegrees="90"            android:pivotX="0"            android:pivotY="0" />    <scale            android:duration="300"            android:fromXScale="2.0"            android:fromYScale="2.0"            android:pivotX="50%p"            android:pivotY="50%p"            android:toXScale="1.0"            android:toYScale="1.0" />    <alpha            android:fromAlpha="0"            android:toAlpha="1" />    <set><!--在此定义子动画集--></set></set>
  • 除了四类View动画特有属性外,还有几个公用属性:

    • android:duration(动画持续时间)
    • android:fillAfter(动画结束后是否停留在结束位置,true:结束位置,false:初始位置)
    • android:interpolator(动画插值器)
    • android:repeatMode(动画重复模式)
    • android:startOffset(动画延迟时间,单位:ms,默认300ms)
    • android:shareInterpolator(动画集是否共享插值器)

    定义好View动画后,下面就是应用动画了:

Animation animation = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.customize_anim);animation.setAnimationListener(new Animation.AnimationListener() {  //监听动画过程            @Override            public void onAnimationStart(Animation animation) {            }            @Override            public void onAnimationEnd(Animation animation) {            }            @Override            public void onAnimationRepeat(Animation animation) {            }        });imageView.startAnimation(animation);
 如上,可以对动画添加监听过程。
  • 自定义View动画过程:
    a、继承抽象类Animation,重写initialize()、applyTransformation()方法
    b、initialize()进行初始化操作
    c、applyTransformation()进行相应的矩阵变换实现动画效果,使用Camera可以简化矩阵变换过程

  • 帧动画:
    系统提供AnimationDrawable来使用动画,因其是顺序播放一组图片来实现动画,特别消耗内存,并且容易引起OOM,所以不建议使用。

  • View动画特殊使用场景
    View动画可以应用于ViewGroup场景,用于控制子控件的出场效果,常见的有ListView和Activity的切换效果等,具体实现在此不做详细说明。

三、属性动画

  • 属性动画是Api 11加入的新特性,要想兼容Api 11以下版本,可以使用开源库nineoldandroids实现,该开源库的使用和原生的属性动画的使用完全一致。属性动画不再局限于View的变换,它可以实现任意属性值的变化,进而形成动画效果,常用的类有ObjectAnimation、ValueAnimation、AnimationSet等,其中AnimationSet是动画集合,ObjectAnimation是ValueAnimation的子类,属性动画的简单使用示例:
  ObjectAnimator animator = ObjectAnimator.ofFloat(imageView,"translationY",200);        animator.setRepeatMode(ValueAnimator.RESTART);        animator.setRepeatCount(3);        animator.setEvaluator(new IntEvaluator());        animator.setInterpolator(new AccelerateDecelerateInterpolator());        animator.start();
  • 插值器
    • 插值器是根据时间流逝的百分比计算出当前属性值改变的百分比,系统提供LinearInterpolator(线性插值器,匀速动画)、AccelerateDecelerateInterpolator(加减速插值器,根据cos()函数实现)、DecelerateAccerateInterpolator(减加速插值器,根据sin()函数实现)、DecelerateInterpolator(减速插值器)等,可以实现自定义插值器,只需实现TimeInterpolator接口或者Interpolator接口即可。
  • 估值器
    • 类似于插值器,估值器是根据当前属性值改变的百分比计算出改变后的属性值,系统提供IntEvaluator(Int型属性估值器)、FloatEvaluator(Float型属性估值器)、ArgbEvaluator(颜色属性股指器),估值器同样可以自定义,只需实现TypeEvaluator接口。注:插值器和估值器是实现非匀速动画的重要手段。
  • 属性动画监听
    • 属性动画提供两种类型的监听,分别是AnimatorListener和AnimatorUpdateListener,AnimatorListener被AnimatorListenerAdapter类适配,可以有选择的实现该接口中的方法。AnimatorUpdateListener用于监听动画中的每一帧动画。
  • 属性动画生效的前提条件:在此我们假设对对象A的width属性实施动画效果

    • A对象必须提供setWidth()方法,如果应用时未提供初始值,A还需提供getWidth()方法来获取width的初始值
    • A的setWidth()方法设置的值必须能够通过某种方式反应出来,比如UI的改变等
      以上两个条件必须同时满足,典型案例如Button的width,只满足第一个条件,想要详细了解请见Button的源码getWidth()、setWidth();
      当条件不满足的解决办法,官方提供如下三种:

      • 权限允许的情况下,为A加上get和set方法,基本上不被使用,A大多数来自SDK
      • 包装A类,为其提供get和set方法,用的比较多,示例如下
      • 使用ValueAnimator,监听动画过程
            private static class ViewWrapper{                    private View mTarget;                    public ViewWrapper(View mTarget) {                        this.mTarget = mTarget;                    }                    public int getWidth(){                        return mTarget.getLayoutParams().width;                    }                    public void setWidth(int width){                        mTarget.getLayoutParams().width = width;                        mTarget.requestLayout();                    }                }            //使用包装类            ViewWrapper viewWrapper = new ViewWrapper(textView3);            ObjectAnimator animator = ObjectAnimator.ofInt(viewWrapper,"width",50,500);            animator.setDuration(5000);            animator.start();

四、文章说明
本篇文章是自己对Android动画的学习总结,为了记忆,也为了后面使用方便,如有不对之处,欢迎阅览者提出,在此感谢任志刚老师的《Android开发艺术探索》

0 0
原创粉丝点击