Android动画总结

来源:互联网 发布:淘宝汽车用品好做吗 编辑:程序博客网 时间:2024/06/07 16:38

一、帧动画

  • AnimationDrawable—>DrawableContainer—>Drawable
    1.res/anim中:
<?xml version="1.0" encoding="utf-8"?><animation-list         xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> //是否只执行一次    <item android:drawable="@drawable/title1" android:duration="150"/>    <item android:drawable="@drawable/title2" android:duration="150"/></animation-list>
2.代码中:    控件.setBackgroundResource(R.anim.xx);    AnimationDrawable anima = (AnimationDrawable) 控件.getBackground();    anima.start();

二、补间动画:

  • TranslateAnimation,AlphaAnimation,ScaleAnimation,RotateAnimation—>Animation
  • AnimationSet—>Animation
  • 监听:Animation中:AnimationListener
    onAnimationStart(Animation anim);
    onAnimationEnd(Animation anim);
    onAnimationRepeat(Animation anim);
  • 缺点:并没有真正持久改变View的属性(身心不一),就是说它内部没有一个去记录动画行为的机制;
    1.代码中:
    XxxAnimation anim = new XxxAnimation(…);
    anim.setDuration(1000);
    anim.setInterpolator(Interpolator i);
    anim.setRepeatCount(Animation.INFINITE);
    anim.setRepeatMode(Animation.REVERSE);
    anim.setFillAfter(true);
    控件.startAnimation(ta);

    //true表示各子动画共用set的插值器,false表示各子动画用各自的插值器AnimationSet set = new AnimationSet(false);set.addAnimation(ta);控件.startAnimation(set);

    2.res/anim中:

<alpha/scale/rotate/translate .../>      或<set android:fillAfter="true">    <alpha/scale/rotate/translate .../></set>
3.代码中使用xml定义的动画:    Animation anim = AnimationUtils.loadAnimation(this, R.anim.xx);    控件.startAnimation(anim);

三、属性动画: (3.0=11后推出,因View增加了很多属性,故叫属性动画. 心身合一)

  • ObjectAnimator—>ValueAnimator—>Animator
  • AnimatorSet—>Animator
  • 监听:
  • Animator中:AnimatorListener
    onAnimationStart(Animator anim);
    onAnimationEnd(Animator anim);
    onAnimationCancel(Animator anim);
    onAnimationRepeat(Animator anim);
  • Animator中:AnimatorPauseListener
    onAnimationPause(Animator anim);
    onAnimationResume(Animator anim);
  • ValueAnimator中:AnimatorUpdateListener
    onAnimationUpdate(ValueAnimator anim);

  • 重要方法:

  • Animator中:
    addListener(AnimatorListener listener) 装在ArrayList中
    addPauseListener(AnimatorPauseListener listener):装在ArrayList中
    removeAllListeners() 将上面两个集合清空
    removeListener(AnimatorListener listener) 将上面第一个集合清空
    removePauseListener(AnimatorPauseListener listener) 将上面第二个集合清空
    start()开启动画 end()结束动画
    pause()暂停动画 resume()恢复动画
    cancel()取消动画
    isStarted()动画是否已经开启,且未结束
    isPaused()动画是否暂停
    isRunning()动画是否正在执行
    setDuration(long duration) 设置执行时长
    setInterpolator(TimeInterpolator i) 设置插值器
    setStartDelay(long delay) 开启动画后,延迟指定时间执行
    setTarget(Object target) 将本动画绑定到目标控件上
  • ValueAnimator重要特有:
    addUpdateListener(AnimatorUpdateListener listener) 装在ArrayList中
    removeAllUpdateListeners()清空所有监听
    removeUpdateListener(AnimatorUpdateListener listener) 移除指定监听
    getAnimatedFraction() 获取当前已执行的百分比
    getAnimatedValue() 获取当前正在执行的值
    getCurrentPlayTime() 获取自开启后已执行的时间

    1.代码中:
    ObjectAnimator anim = ObjectAnimator.ofFloat(控件, “属性名”, 可变参数);
    anim.setDuration(1000);
    anim.setInterpolator(Interpolator i);
    anim.setRepeatCount(Animation.INFINITE);
    anim.setRepeatMode(Animation.REVERSE);
    anim.start();

    AnimatorSet set = new AnimatorSet();set.playSequentially(Animator...);set.playSequentially(List<Animator> 集合);set.playTogether(Animator...);set.playTogether(Collection<Animator> 集合);

    2.res/animator中:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"     android:propertyName="alpha"        android:duration="3000"    android:repeatCount="3"    android:repeatMode="reverse"    android:valueFrom="0.0"    android:valueTo="1.0" ></objectAnimator>
3.代码中使用xml定义的动画:    Animator anim = AnimatorInflater.loadAnimator(this, R.animator.xx);    anim.setTarget(控件);    anim.start();

四、值动画:ValueAnimator

1.代码中:    ValueAnimator anim = ValueAnimator.ofFloat(可变参数);     anim.addUpdateListener(mListener);    anim.start();

五、属性动画的向下兼容: NineOldAnidroid.jar—–JackWharton

  • 三大核心类: ViewPropertyAnimator, ViewHelper, ValueAnimator
    ViewPropertyAnimator
    .animate(目标控件)
    .setDuration(100)
    .setInterpolator(new OvershootInterpolator())
    .scaleX/Y(float v) 原始缩放
    .scaleX/YBy(float v)增量缩放
    .alpha(float v) 透明
    .alphaBy(float v)
    .rotation(float v) 平面原始旋转
    .rotationBy(float v)平面增量旋转
    .rotationX/Y(float v) X/Y轴原始旋转
    .rotationX/YBy(float v) X/Y轴增量旋转
    .translationX/Y(float v) 平移
    .translationX/YBy(float v)
    .setListener(Animator.AnimatorListener)
    .setStartDelay(1000)
    .start();

    ViewHelper.setAlpha(目标控件,float v); 设置透明度
    ViewHelper.setScaleX/Y(目标控件,float v); 设置X/Y轴缩放
    ViewHelper.setRotation(目标控件,float v); 设置平面旋转
    ViewHelper.setRotationX/Y(目标控件,float v); 设置X/Y轴旋转
    ViewHelper.setTranslationX/Y(目标控件,float v); 设置X/Y轴平移到
    ViewHelper.setPivotX/Y(目标控件,float v); 设置中心坐标
    ViewHelper.setX/Y(目标控件,float v); 设置相对控件左上角X/Y轴坐标

    ValueAnimator 用法与原生的ValueAnimator一样

六、各类插值器—->TimeInterpolator

|AccelerateDecelerateInterpolator |在动画开始与结束的地方速率改变比较慢,在中间的时候加速|
|AccelerateInterpolator|在动画开始的地方速率改变比较慢,然后开始加速|
|AnticipateInterpolator |开始的时候向后然后向前甩|
|AnticipateOvershootInterpolator |开始的时候向后然后向前甩一定值后返回最后的值|
|BounceInterpolator|动画结束的时候弹起|
|CycleInterpolator |动画循环播放特定的次数,速率改变沿着正弦曲线|
|DecelerateInterpolator|在动画开始的地方快然后慢|
|LinearInterpolator|以常量速率改变|
|OvershootInterpolator|向前甩一定值后再回到原来位置|

  • 自定义插值器
    1.继承TimeInterpolator
    2.重写
    public float getInterpolation(float input) {
    return 数字公式,如(float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
    }

八、估值器—–>TypeEvaluator

public T evaluate(float fraction, T startValue, T endValue);

* ArgbEvaluator 透明估值器
* IntEvaluator, IntArrayEvaluator
* FloatEvaluator, FloatArrayEvaluator
* RectEvaluator 矩形估值器
* PointFEvaluator 点估值器

九、注意事项

1.应开子线程去播放动画2.动画要想生效,必须有父容器
原创粉丝点击