一、帧动画
- 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.动画要想生效,必须有父容器