Animation 动画类型php
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@mipmap/audio_anim_01" android:duration="200" /> <item android:drawable="@mipmap/audio_anim_02" android:duration="200" /> <item android:drawable="@mipmap/audio_anim_03" android:duration="200" /> <item android:drawable="@mipmap/audio_anim_04" android:duration="200" /> <item android:drawable="@mipmap/audio_anim_05" android:duration="200" /> <item android:drawable="@mipmap/audio_anim_06" android:duration="200" /> <item android:drawable="@mipmap/audio_anim_07" android:duration="200" /> <item android:drawable="@mipmap/audio_anim_08" android:duration="200" /> <item android:drawable="@mipmap/audio_anim_09" android:duration="200" /> </animation-list>
AnimationDrawable drawable = new AnimationDrawable(); for(int a=0 ; a<9 ; a++){ int id = getResources().getIdentifier("audio_anim_0" + a, "mipmap", getPackageName()); Drawable da = getResources().getDrawable(id); drawable.addFrame(da,200); } ivVisualEffect.setBackground(drawable); drawable.setOneShot(false); //获取对象实例,用来控制播放与中止 AnimationDrawable rocketAnimation = (AnimationDrawable) ivVisualEffect.getBackground(); rocketAnimation.start(); // 开启帧动画 rocketAnimation.stop(); // 中止动画
透明度变化
大小缩放变化
位移变化
旋转变化java
alph 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果
AlphaAnimation 渐变透明度动画效果 ScaleAnimation 渐变尺寸伸缩动画效果 TranslateAnimation 画面转换位置移动动画效果 RotateAnimation 画面转移旋转动画效果
AccelerateInterpolator 加速,开始时慢中间加速 DecelerateInterpolator 减速,开始时快而后减速 AccelerateDecelerateInterolator 先加速后减速,开始结束时慢,中间加速 AnticipateInterpolator 反向,先向相反方向改变一段再加速播放 AnticipateOvershootInterpolator 反向加超越,先向相反方向改变,再加速播放,会超出目的值而后缓慢移动至目的值 BounceInterpolator 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100 CycleIinterpolator 循环,动画循环必定次数,值的改变为一正弦函数:Math.sin(2* mCycles* Math.PI* input) LinearInterpolator 线性,线性均匀改变 OvershootInterpolator超越,最后超出目的值而后缓慢改变到目的值 PathInterpolator新增的,就是能够定义路径坐标,而后能够按照路径坐标来跑动;注意其坐标并非 XY,而是单方向,也就是我能够从0~1,而后弹回0.5 而后又弹到0.7 有到0.3,直到最后时间结束。
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha android:duration="1000" android:fromAlpha="0.0" android:toAlpha="1.0" /> <!-- 透明度控制动画效果 alpha 浮点型值: fromAlpha 属性为动画起始时透明度 toAlpha 属性为动画结束时透明度 说明: 0.0表示彻底透明 1.0表示彻底不透明 以上值取0.0-1.0之间的float数据类型的数字 长整型值: duration 属性为动画持续时间 说明:时间以毫秒为单位 --> </set>
AlphaAnimation alpha = new AlphaAnimation(0, 1); alpha.setDuration(500); //设置持续时间 alpha.setFillAfter(true); //动画结束后保留结束状态 alpha.setInterpolator(new AccelerateInterpolator()); //添加差值器 ivImage.setAnimation(alpha);
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:duration="1000" android:fillAfter="false" android:fromXScale="0.0" android:fromYScale="0.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.4" android:toYScale="1.4" /> <!-- 尺寸伸缩动画效果 scale 属性:interpolator 指定一个动画的插入器 在我试验过程当中,使用android.res.anim中的资源时候发现 有三种动画插入器: accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其余的属于特定的动画效果 浮点型值: fromXScale 属性为动画起始时 X坐标上的伸缩尺寸 toXScale 属性为动画结束时 X坐标上的伸缩尺寸 fromYScale 属性为动画起始时Y坐标上的伸缩尺寸 toYScale 属性为动画结束时Y坐标上的伸缩尺寸 说明: 以上四种属性值 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大 pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 说明: 以上两个属性值 从0%-100%中取值 50%为物件的X或Y方向坐标上的中点位置 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 布尔型值: fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用 --> </set>
ScaleAnimation scale = new ScaleAnimation(1.0f, scaleXY, 1.0f, scaleXY, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); scale.setDuration(durationMillis); scale.setFillAfter(true); ivImage.setAnimation(scale);
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="2000" android:fromXDelta="30" android:fromYDelta="30" android:toXDelta="-80" android:toYDelta="300" /> <!-- translate 位置转移动画效果 整型值: fromXDelta 属性为动画起始时 X坐标上的位置 toXDelta 属性为动画结束时 X坐标上的位置 fromYDelta 属性为动画起始时 Y坐标上的位置 toYDelta 属性为动画结束时 Y坐标上的位置 注意: 没有指定fromXType toXType fromYType toYType 时候, 默认是以本身为相对参照物 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 --> </set>
TranslateAnimation translate = new TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta); translate.setDuration(durationMillis); translate.setFillAfter(true); ivImage.setAnimation(translate);
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <rotate android:duration="3000" android:fromDegrees="0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toDegrees="+350" /> <!-- rotate 旋转动画效果 属性:interpolator 指定一个动画的插入器 在我试验过程当中,使用android.res.anim中的资源时候发现 有三种动画插入器: accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其余的属于特定的动画效果 浮点数型值: fromDegrees 属性为动画起始时物件的角度 toDegrees 属性为动画结束时物件旋转的角度 能够大于360度 说明: 当角度为负数-表示逆时针旋转 当角度为正数-表示顺时针旋转 (负数from-to正数:顺时针旋转) (负数from-to负数:逆时针旋转) (正数from-to正数:顺时针旋转) (正数from-to负数:逆时针旋转) pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 说明: 以上两个属性值 从0%-100%中取值 50%为物件的X或Y方向坐标上的中点位置 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 --> </set>
RotateAnimation rotate = new RotateAnimation(fromDegrees, toDegrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotate.setDuration(durationMillis); rotate.setFillAfter(true); ivImage.setAnimation(rotate);
public interface TypeEvaluator<T> { public T evaluate(float fraction, T startValue, T endValue); }
看看如何实现估值器android
public static ValueAnimator ofArgb(int... values) { ValueAnimator anim = new ValueAnimator(); anim.setIntValues(values); anim.setEvaluator(ArgbEvaluator.getInstance()); return anim; } //-------------------- public class ArgbEvaluator implements TypeEvaluator { private static final ArgbEvaluator sInstance = new ArgbEvaluator(); public static ArgbEvaluator getInstance() { return sInstance; } // FloatEvaluator实现了TypeEvaluator接口 public Object evaluate(float fraction, Object startValue, Object endValue) { // 参数说明 // fraction:表示动画完成度(根据它来计算当前动画的值) // startValue、endValue:动画的初始值和结束值 int startInt = (Integer) startValue; int startA = (startInt >> 24) & 0xff; int startR = (startInt >> 16) & 0xff; int startG = (startInt >> 8) & 0xff; int startB = startInt & 0xff; int endInt = (Integer) endValue; int endA = (endInt >> 24) & 0xff; int endR = (endInt >> 16) & 0xff; int endG = (endInt >> 8) & 0xff; int endB = endInt & 0xff; // 初始值 过渡 到结束值 的算法是: // 1. 用结束值减去初始值,算出它们之间的差值 // 2. 用上述差值乘以fraction系数 // 3. 再加上初始值,就获得当前动画的值 return (int)((startA + (int)(fraction * (endA - startA))) << 24) | (int)((startR + (int)(fraction * (endR - startR))) << 16) | (int)((startG + (int)(fraction * (endG - startG))) << 8) | (int)((startB + (int)(fraction * (endB - startB)))); } }
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially" > <!--表示Set集合内的动画按顺序进行--> <!--ordering的属性值:sequentially & together--> <!--sequentially:表示set中的动画,按照前后顺序逐步进行(a 完成以后进行 b )--> <!--together:表示set中的动画,在同一时间同时进行,为默认值--> <set android:ordering="together" > <!--下面的动画同时进行--> <objectAnimator android:duration="2000" android:propertyName="translationX" android:valueFrom="0" android:valueTo="300" android:valueType="floatType" > </objectAnimator> <objectAnimator android:duration="3000" android:propertyName="rotation" android:valueFrom="0" android:valueTo="360" android:valueType="floatType" > </objectAnimator> </set> <set android:ordering="sequentially" > <!--下面的动画按序进行--> <objectAnimator android:duration="1500" android:propertyName="alpha" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" > </objectAnimator> <objectAnimator android:duration="1500" android:propertyName="alpha" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" > </objectAnimator> </set> </set> //关于代码中引用 AnimatorSet animator = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.set_animation); // 建立组合动画对象 & 加载XML动画 animator.setTarget(mButton); // 设置动画做用对象 animator.start(); // 启动动画
// 步骤1:设置须要组合的动画效果 ObjectAnimator translation = ObjectAnimator.ofFloat(mButton, "translationX", curTranslationX, 300,curTranslationX); // 平移动画 ObjectAnimator rotate = ObjectAnimator.ofFloat(mButton, "rotation", 0f, 360f); // 旋转动画 ObjectAnimator alpha = ObjectAnimator.ofFloat(mButton, "alpha", 1f, 0f, 1f); // 透明度动画 // 步骤2:建立组合动画的对象 AnimatorSet animSet = new AnimatorSet(); // 步骤3:根据需求组合动画 animSet.play(translation).with(rotate).before(alpha); animSet.setDuration(5000); // 步骤4:启动动画 animSet.start();
AnimatorSet.play(Animator anim) :播放当前动画 AnimatorSet.after(long delay) :将现有动画延迟x毫秒后执行 AnimatorSet.with(Animator anim) :将现有动画和传入的动画同时执行 AnimatorSet.after(Animator anim) :将现有动画插入到传入的动画以后执行 AnimatorSet.before(Animator anim) : 将现有动画插入到传入的动画以前执行
ValueAnimator.oFloat()采用默认的浮点型估值器 (FloatEvaluator)
ValueAnimator.ofInt()采用默认的整型估值器(IntEvaluator)git
public static ValueAnimator setValueAnimator(View view , int start , int end , int time , int delay , int count){ // 步骤1:设置动画属性的初始值 & 结束值 ValueAnimator mAnimator = ValueAnimator.ofInt(start, end); // ofInt()做用有两个 // 1. 建立动画实例 // 2. 将传入的多个Int参数进行平滑过渡:此处传入0和1,表示将值从0平滑过渡到1 // 若是传入了3个Int参数 a,b,c ,则是先从a平滑过渡到b,再从b平滑过渡到C,以此类推 // ValueAnimator.ofInt()内置了整型估值器,直接采用默认的.不须要设置,即默认设置了如何从初始值 过渡到 结束值 // 关于自定义插值器我将在下节进行讲解 // 下面看看ofInt()的源码分析 ->>关注1 mAnimator.setTarget(view); // 步骤2:设置动画的播放各类属性 mAnimator.setDuration(time); // 设置动画运行的时长 mAnimator.setStartDelay(delay); // 设置动画延迟播放时间 mAnimator.setRepeatCount(count); // 设置动画重复播放次数 = 重放次数+1 // 动画播放次数 = infinite时,动画无限重复 mAnimator.setRepeatMode(ValueAnimator.RESTART); // 设置重复播放动画模式 // ValueAnimator.RESTART(默认):正序重放 // ValueAnimator.REVERSE:倒序回放 // 步骤3:将改变的值手动赋值给对象的属性值:经过动画的更新监听器 // 设置 值的更新监听器 // 即:值每次改变、变化一次,该方法就会被调用一次 return mAnimator; } //------- Button b1 = (Button) findViewById(R.id.b1); ValueAnimator valueAnimator = AnimatorUtils.setValueAnimator(b1,0, 2, 2000, 500, 2); valueAnimator.start();
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <animator android:valueFrom="0" android:valueTo="100" android:valueType="intType" android:duration="3000" android:startOffset ="1000" android:fillBefore = "true" android:fillAfter = "false" android:fillEnabled= "true" android:repeatMode= "restart" android:repeatCount = "0" android:interpolator="@android:anim/accelerate_interpolator"/> <!--初始值--> <!--结束值--> <!--变化值类型 :floatType & intType--> <!--动画持续时间(ms),必须设置,动画才有效果--> <!--动画延迟开始时间(ms)--> <!--动画播放完后,视图是否会停留在动画开始的状态,默认为true--> <!--动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false--> <!--是否应用fillBefore值,对fillAfter值无影响,默认为true--> <!--选择重复播放动画模式,restart表明正序重放,reverse表明倒序回放,默认为restart|--> <!--重放次数(因此动画的播放次数=重放次数+1),为infinite时无限重复--> <!--插值器,即影响动画的播放速度,下面会详细讲--> </set> //代码引用 Button b3 = (Button) findViewById(R.id.b3); Animator mAnim = AnimatorInflater.loadAnimator(this, R.animator.animator_1_0); mAnim.setTarget(b3); mAnim.start();
继承自ValueAnimator类,即底层的动画实现机制是基于ValueAnimator类github
public static ObjectAnimator setObjectAnimator(View view , String type , int start , int end , long time){ ObjectAnimator mAnimator = ObjectAnimator.ofFloat(view, type, start, end); // ofFloat()做用有两个 // 1. 建立动画实例 // 2. 参数设置:参数说明以下 // Object object:须要操做的对象 // String property:须要操做的对象的属性 // float ....values:动画初始值 & 结束值(不固定长度) // 如果两个参数a,b,则动画效果则是从属性的a值到b值 // 如果三个参数a,b,c,则则动画效果则是从属性的a值到b值再到c值 // 以此类推 // 至于如何从初始值 过渡到 结束值,一样是由估值器决定,此处ObjectAnimator.ofFloat()是有系统内置的浮点型估值器FloatEvaluator,同ValueAnimator讲解 // 设置动画重复播放次数 = 重放次数+1 // 动画播放次数 = infinite时,动画无限重复 mAnimator.setRepeatCount(ValueAnimator.INFINITE); // 设置动画运行的时长 mAnimator.setDuration(time); // 设置动画延迟播放时间 mAnimator.setStartDelay(0); // 设置重复播放动画模式 mAnimator.setRepeatMode(ValueAnimator.RESTART); // ValueAnimator.RESTART(默认):正序重放 // ValueAnimator.REVERSE:倒序回放 //设置差值器 mAnimator.setInterpolator(new LinearInterpolator()); return mAnimator; }
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <ObjectAnimator android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:duration = "800" android:propertyName="alpha"/> </set> Animator mAnim = AnimatorInflater.loadAnimator(this, R.animator.animator_1_0); mAnim.setTarget(fabHomeRandom); mAnim.start();
经过在Java代码里addListener()设置
因Animator类、AnimatorSet类、ValueAnimator、ObjectAnimator类存在继承关系,因此AnimatorSet类、ValueAnimator、ObjectAnimator均可以使用addListener()监听器进行动画监听算法
mAnim.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { //动画开始时执行 } @Override public void onAnimationEnd(Animator animation) { //动画结束时执行 } @Override public void onAnimationCancel(Animator animation) { //动画取消时执行 } @Override public void onAnimationRepeat(Animator animation) { //动画重复时执行 } });
mAnim2.addListener(new AnimatorListenerAdapter() { // 向addListener()方法中传入适配器对象AnimatorListenerAdapter() // 因为AnimatorListenerAdapter中已经实现好每一个接口 // 因此这里不实现所有方法也不会报错 @Override public void onAnimationCancel(Animator animation) { super.onAnimationCancel(animation); ToastUtils.showShort("动画结束了"); } });