Android動畫的分類(屬性動畫和視圖動畫)與使用總結(參照官方api)

why?

爲什麼使用動畫,自從Android5.0以後,Google宣佈了Material Design的設計語言,也增加了很多動畫效果,使得app看起來更自然美觀,交互體驗更好。在我們的app裏如果適當的使用動畫的話,會給app帶來更棒的交互體驗,當然如果動畫用的不合適或者濫用的話,也會帶來更糟的體驗。所以我們在瞭解動畫機制的情況下適當的使用動畫纔是錦上添花。

這裏提供Google對Material Design對介紹地址:https://material.io/guidelines/motion/material-motion.html#

Android中動畫的分類

Android framework 提供了2中動畫框架:屬性動畫和視圖動畫。兩種動畫框架都是可行的,但一般來說屬性動畫是首選的方法,因爲它使用起來更靈活也提供了更多的特性,除了這兩種動畫框架,也可以使用幀動畫(Drawable animation),幀動畫允許加載並展示一張一張的可描繪資源組成動畫。

Property Animation(屬性動畫)

屬性動畫是在Android3.0之後提供的動畫,可以對一個對象的屬性進行操作,從而達到動畫的效果,包括沒有被渲染到屏幕上的,該系統是可擴展的,讓您可以將定製類型的屬性進行動畫化。

View Animation(視圖動畫)

視圖動畫是較老的系統,只能用於視圖,設置和提供足夠的能力來滿足許多應用程序的需求是相對容易的

Drawable Animation(幀動畫)

可繪製的動畫需要一個接一個地顯示可繪製的資源,就像膠捲一樣。如果您希望用可繪製的資源來表示更容易表示的動畫,比如位圖的進展,那麼這種動畫方法是非常有用的。

視圖動畫與屬性動畫的區別(How Property Animation Differs from View Animation)

只能支持簡單的縮放、平移、旋轉、透明度基本的動畫,且有一定的侷限性。

視圖動畫系統的另一個缺點是它只修改了視圖被繪製的地方,而不是實際的視圖本身。例如對一個imageview添加事件後,平移那麼事件還是會在之前的位置。

屬性動畫將不存在這些限制,您可以對任何對象(視圖和非視圖)的任何屬性進行動畫,並且對象本身實際上是被修改的。視圖動畫的使用比較簡單。

屬性動畫的使用

ObjectAnimator

ObjectAnimator是屬性動畫框架中最重要的實行類,創建一個ObjectAnimator只需要通過靜態工廠類直接返回一個ObjectAnimator對象即可。參數包含一個對象和對象的屬性名字,但是這個屬性必須有get和set函數,內部會通過反射機制來調用set函數修改對象的屬性值。

例如:一個圖片平移的動畫


ObjectAnimator anim = ObjectAnimator
.ofFloat(view, "translationX", 300)
.setDuration(500);
anim.start();

通過這段代碼就能使得這個view進行平移動畫。
ofFloat源碼:


public static <T> ObjectAnimator ofArgb(T target, Property<T, Integer> property,
int... values) {
ObjectAnimator animator = ofInt(target, property, values);
animator.setEvaluator(ArgbEvaluator.getInstance());
return animator;
}

第一個參數是我們要操縱的view,第二個參數是要操縱的屬性。
最後一個是一個可變數組參數,需要穿進去該屬性變化的一個取值過程,這裏設置了一個參數,即變化到300。
常用的屬性:

屬性名稱 屬性描述
translationX和translationY 這兩個屬性作爲一種增量來控制着view對象從它佈局容器的左上角座標偏移的位置
ratation,rotationX,rotationY 這三個屬性控制view對象圍繞支點進行2D和3D旋轉
scaleX,scaleY 這兩個屬性控制着view對象圍繞它的指點進行2D縮放
pivotX,pivotY 這兩個屬性控制着view對象的支點位置,圍繞這個支點進行旋轉和縮放變換處理。默認情況下,該質點的位置就是view對象的中心點
x,y 這兩個簡單實用的屬性,它描述了view對象在它的容器中的最終位置,它是最初的組奧上交座標和translationX,translationY值的累積和。
alpha 它表示view對象的alpha透明度。默認值是1(不透明),0代表完全透明(不可見)。

ValueAnimator

ValueAnimator類允許您通過指定一組int、float或顏色值來激活動畫的持續時間,從而監聽數值的變化完成動畫的變換。


ValueAnimator animation = ValueAnimator.ofFloat(0, 100);
animation.setTarget(view);
animation.setDuration(1000);
animation.start();
animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float value = animation.getAnimatedFraction();
Log.e("tag", String.valueOf(value));
}
});

動畫事件的監聽

objectAnimator可以監聽動畫從開始到結束的四個過程。

““
anim.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) {

        }
    });

““

不過大部分時候我們需要關心動畫結束時,所以可以直接這樣:


anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});

AnimatorSet

AnimatorSet可以實現多種動畫的展示。


AnimatorSet set=new AnimatorSet();
set.setDuration(1000);
set.playTogether(anim1,anim2);
set.start();

除了set.playTogether()方法,還有playSequentially(),set.play().with(),set.play().before(),set.play().after()等方法來控制多個動畫的協同工作方式,從而控制順序。

視圖動畫的使用

在3.0之前,視圖動畫是被廣泛應用,但3.0後屬性動畫的出現,使得視圖動畫的缺點也就被放大了。主要一個缺點就是當視圖移動後,其響應事件的位置還依然在動畫前的地方,所以視圖動畫只能做普通的動畫展示效果,避免交互的發生。

主要提供了AlphaAnimation,RotateAnimation,TranslateAnimation,ScaleAnimation四種動畫方式,也提供了AnimationSet動畫集合,混合使用多種動畫。

RotateAnimation(旋轉動畫)


RotateAnimation rotateAnimation=new RotateAnimation(0,360,100,100);
rotateAnimation.setDuration(1000);
view.startAnimation(rotateAnimation);

參數分別爲旋轉的起始角度和旋轉中心點的座標。

TranslateAnimation(位移動畫)

ScaleAnimation(縮放動畫)

總結:其實每種動畫的的使用方式基本相同,無非就是一些參數的特性不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章