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("動畫結束了"); } });