心靈雞湯:天下事有難易乎,為之,則難者亦易矣;不為,則易者亦難矣。 摘要 當你已經掌握了Tween Animation之後,再來看Frame Animation,你就會頓悟,喔,原來Frame Animation簡單多了,那麼恭喜你,你已經在Animation這條路上走得越來越遠了,當你花十來分鐘認 ...
心靈雞湯:天下事有難易乎,為之,則難者亦易矣;不為,則易者亦難矣。
摘要
當你已經掌握了Tween Animation之後,再來看Frame Animation,你就會頓悟,喔,原來Frame Animation簡單多了,那麼恭喜你,你已經在Animation這條路上走得越來越遠了,當你花十來分鐘認真看完這篇文章,你就已經走完了動畫這條小路的2/3。
概述
我們都知道,在Android系統中,官方給我們提供了兩種類型的動畫:屬性動畫(Property Animation) 和 視圖動畫(View Animation),而視圖動畫又包含了兩種類型:補間動畫(Tween animation) 和 幀動畫(Frame animation)。
在Android基礎夯實--重溫動畫(一)之Tween Animation我們已經對Tween Animation進行了詳細講解,這一片,我會給大家介紹視圖動畫的另一種 Frame Animation。
在開發中,除了常用的Tween Animation以外,我們還會用到Frame Animation,就是我們所說的幀動畫,之所以要實現幀動畫是因為它可以實現類似電影的動態效果,因為我們平時所拍的視頻也是通過一張張照片插入每一幀,串聯起來,從而實現連續播放的視覺效果,而這Tween Animation是無法實現,只能通過Frame Animation來實現。例如我們常見的App動態引導頁,很多都是通過Frame Animation來實現的。
總體來說,Frame Animation實現起來也是比較簡單,本文也是主要做一個拋磚引玉,只做基本介紹,更多進階知識需要大家日後摸索,更權威解釋可以看官方文檔:Frame Animation。以下先通過Demo給大家更直觀地展示Frame Animation。
本文主要對View Animation的Frame Animation做介紹,如果大家有興趣,可以繼續閱讀本動畫系列其他相關文章,作者也在不斷更新完善相關內容,希望大家可以指出有誤之處。
Android基礎夯實--重溫動畫(一)之Tween Animation
Android基礎夯實--重溫動畫(三)之初識Property Animation
Android基礎夯實--重溫動畫(四)之屬性動畫 ValueAnimator詳解
Demo
這個Demo主要是使用Frame Animation來實現ImageView播放gif圖效果。
效果圖
代碼實現
- 首先在res/drawable/目錄下,增添一個frame.xml文件,裡面主要寫每一幀播放哪一張照片。最外層標簽必須是animation-list,子標簽item對應每一幀,每一個item裡面的drawable屬性對應圖片位置、duration對應一幀的時長。
<?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/g1"
android:duration="200" />
<item
android:drawable="@drawable/g2"
android:duration="200" />
<item
android:drawable="@drawable/g3"
android:duration="200" />
<item
android:drawable="@drawable/g4"
android:duration="200" />
<item
android:drawable="@drawable/g5"
android:duration="200" />
<item
android:drawable="@drawable/g6"
android:duration="200" />
</animation-list>
- 在Activity中,實現如下代碼:
//將控制項背景設置為我們的AnimationDrawable資源文件
image.setBackgroundResource(R.drawable.frame);
mBinding.play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//拿到要編譯成AnimationDrawable的背景
AnimationDrawable imageAnimation = (AnimationDrawable)image.getBackground();
//開始動畫
imageAnimation.start();
}
});
Frame Animation
在Android的官方文檔中,Google對Frame Animation的講解只是用了比較小的篇幅,可能是因為過於簡單,當然,大家通過我上面所說的例子也可以看得出Frame Animation的使用也是非常的簡單,下麵主要介紹Frame Animation的要點。
文件位置
在資源文件夾下:res/drawable/filename.xml
編譯
在上面的例子我們可以瞭解到,在Activity中,我們是通過image.getBackground()獲取到的對象轉為了AnimationDrawable,這是因為在我們的xml文件被編譯器編譯之後就變成了 AnimationDrawable類。
語法
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>
標簽
** < animation-list > ** :外層必須要的標簽,裡面包含一個以上的
- 屬性:
- android:oneshot:true則只運行一次,false則重覆動畫。
** < item > ** :每一幀的動畫,必須是
- 屬性:
- android:drawable:對應資源文件。
- android:duration:每一幀時長。
AnimationDrawable
AnimationDrawable就是對應於我們自身定義的xml文件,在Java代碼中將xml對象轉為了AnimationDrawable之後,我們就可以通過它來獲取xml文件裡面的屬性。
父類
AnimationDrawable繼承於Object -> Drawable -> DrawableContainer。
介面
實現了Runnable, Animatable介面。
XML文件中的變數
- android:drawable: 用於該幀的圖片。
- android:duration: 每一幀的時長。
- android:oneshot: true則只運行一次,false則重覆動畫。
- android:variablePadding: 如果true,允許drawable文件的當前狀態改變。
- android:visible: 是否可見。
方法
- void addFrame (Drawable frame, int duration): 添加一幀動畫到動畫裡面。
- int getDuration (int i): 獲取第i幀的時長。
- Drawable getFrame (int index): 獲取第i幀的Drawbale。
- int getNumberOfFrames (): 獲取共有多少幀。
- void inflate (Resources r, XmlPullParser parser, AttributeSet attrs, Resources.Theme theme): 從XML資源裡面載入一個Drawable文件。
- boolean isOneShot (): 判斷是否單次播放。
- boolean isRunning (): 判斷動畫是否還在運行。
- Drawable mutate (): 一個drawable如果使用了mutate()方法,那麼對這個drawable屬性(包括設置drawable的透明度)修改將不會共用。
- void setOneShot (boolean oneShot): 設置動畫播放一次或者迴圈。
- boolean setVisible (boolean visible, boolean restart): 設置該AnimationDrawable是否可見。
- void start (): 播放。
- void stop (): 停止。
- void unscheduleSelf (Runnable what): 讓動畫重新回到-1幀。
總結
Frame Animation總體來說比較簡單,通過XML的劃分幀,在Java代碼中獲取到編譯的AnimationDrawable,然後進行播放,難點不多,卻是很多引導頁的常用實現方法。