Android中的tween動畫, 幀動畫, 和3.0以後的屬性動畫的用法及不同!

本博客是查看了guolin大大的動畫3篇,自己想總結收拾變成自己的東西所以寫的.如有雷同,你們懂~
在android中,總所周知動畫的形式有3種, 一種是tweened-animation(補間動畫)漸變動畫.一種是frame-by-frame animation(幀動畫),最後一種是Andorid3.0開始的property animation(屬性動畫),其實在android中動畫的效果已經很齊全了. 爲什麼在3.0以後的安卓中又要加上這個屬性動畫呢? 我們常說的事物出現就有其自然規律.也是在android中我們可以用tweened動畫.來實現一個視圖View的旋轉/平移/縮放/淡入淡出/和控制動畫播放速度等效果.不過不知道你們注意過沒有就是補間動畫tweened-animation改變的只是UI效果, 但是在android隨着發展這就已經不夠我們日益增多的功能效果的要求了. 於是屬性動畫應運而生. 屬性動畫最本質的改變就是在補間動畫的基礎上實現了tweened動畫的效果, 然後也改變裏面的具體屬性.比如說一個button(按鈕)把它移動到任意其他的地方,你會發現在補間動畫中,按鈕的觸發效果還是原先的初始的地點, 而屬性動畫完成的效果就是按鈕出現什麼地方,它的點擊響應就在哪裏!
–注意上面我在介紹補間動畫的時候都有使用“對View進行操作”這樣的描述,沒錯,補間動畫是隻能夠作用在View上的。也就是說,我們可以對一個Button、TextView、甚至是LinearLayout、或者其它任何繼承自View的組件進行動畫操作,但是如果我們想要對一個非View的對象進行動畫操作,抱歉,補間動畫就幫不上忙了。可能有的朋友會感到不能理解,我怎麼會需要對一個非View的對象進行動畫操作呢?這裏我舉一個簡單的例子,比如說我們有一個自定義的View,在這個View當中有一個Point對象用於管理座標,然後在onDraw()方法當中就是根據這個Point對象的座標值來進行繪製的。也就是說,如果我們可以對Point對象進行動畫操作,那麼整個自定義View的動畫效果就有了。顯然,補間動畫是不具備這個功能的,這是它的第一個缺陷。–這一段不是很懂.

屬性動畫機制已經不再是針對於View來設計的了,也不限定於只能實現移動、縮放、旋轉和淡入淡出這幾種動畫操作,同時也不再只是一種視覺上的動畫效果了。它實際上是一種不斷地對值進行操作的機制,並將值賦值到指定對象的指定屬性上,可以是任意對象的任意屬性。所以我們仍然可以將一個View進行移動或者縮放,但同時也可以對自定義View中的Point對象進行動畫操作了。我們只需要告訴系統動畫的運行時長,需要執行哪種類型的動畫,以及動畫的初始值和結束值,剩下的工作就可以全部交給系統去完成了。

屬性動畫的使用分享.
ValueAnimator value = ValueAnimator.ofFloat(0f, 1f )
anim.setDuration(300);//設置動畫時長
//添加動畫監聽,
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();
Log.d("TAG", "cuurent value is " + currentValue);
}
});
anim.start();
//開啓動畫

在andorid中經常使用的方法是ObjectAnimator , 它可以對任意對象進行操作. 例如view的alpha(透明)

ObjectAnimator animator = ObjectAnimator.ofFloat(textview,
//第一個參數傳入操作的控件,參數2:是具體動畫, 參數3~5:從開始到結束,到停止時的一個展示;
"alpha", 1f, 0f, 1f);
animator.setDuration(5000);//設置時長5秒,然後開啓動畫
animator.start();

其他的也都是一樣操作.只要把傳入的具體動畫修改成
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
這樣就可以實現旋轉的動畫效果.

那麼如果想要將TextView先向左移出屏幕,然後再移動回來,就可以這樣寫:

float curTranslationX = textview.getTranslationX();
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX, -500f, curTranslationX);
animator.setDuration(5000);
animator.start();
這裏我們先是調用了TextView的getTranslationX()方法來獲取到當前TextView的translationX的位置,然後ofFloat()方法的第二個參數傳入"translationX",緊接着後面三個參數用於告訴系統TextView應該怎麼移動

最後有一個屬性動畫的集合類,組合動畫:
ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();

最後我們這個屬性動畫都是可以設置一個監聽.來查看動畫是否實現.OnListener()

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