Android動畫-Frame Animation

jopen 9年前發布 | 15K 次閱讀 Android開發 移動開發 Frame Animation

動畫可以在視覺上增加程序的流暢度,我之前對于動畫這一塊,是會用,但是不全面,這里寫下博客,全面梳理一下Android動畫方面的知識。當然,關于動畫這塊,也有很多前人寫了很多內容,大家可以去參考。

3.0以前,android支持兩種動畫模式,Tween Animation,Frame Animation,在android3.0中又引入了一個新的動畫系統:Property Animation,這三種動畫模式在SDK中被稱為Property Animation,View Animation,Drawable Animation。 可通過NineOldAndroids項目在3.0之前的系統中使用Property Animation。另外呢,還有activity之間的過渡動畫,android5.0增加的矢量動畫,過渡效果等。

本文首先來說Frame Animation.

幀動畫,在android中又稱Drawable Animation,就是通過一系列的Drawable依次顯示來達到模擬動畫的效果。
android中提供了AnimationDrawable類來實現幀動畫,我們可以使用AnimationDrawable作為View的背景。我們通常可以使用xml來配置動畫。

在項目的res/drawable/目錄下面創建一個xml文件。

文件中以<animation-list>作為根節點, 每一張圖片作為一個<item>。

如:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

上面代碼中,onshot若為true,則動畫只播放一次,否則動畫會循環播放。item中的duration用于設置當前幀的停留時間。

在代碼中獲取并,啟動動畫。

如上面的xml文件為rocket_thrust.xml,則在代碼中使用如下:

AnimationDrawable rocketAnimation;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
rocketAnimation.start();
return true;
}
return super.onTouchEvent(event);
}

上面代碼具體就是首先從資源中獲取到我們的動畫,然后設置為view的背景,之后啟動動畫。

需要注意的是,動畫的啟動需要在view和window建立連接后才可以繪制,比如上面代碼是在用戶觸摸后啟動。如果我們需要打開界面就啟動動畫的話,則可以在Activity的onWindowFocusChanged()方法中啟動。

上面介紹的是在xml中定義動畫,當然也可以在java代碼中定義動畫。如:

AnimationDrawable rocketAnimation;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketAnimation = new AnimationDrawable();
rocketAnimation.addFrame(getResources().getDrawable(R.drawable.rocket_thrust1, 200);
rocketAnimation.addFrame(getResources().getDrawable(R.drawable.rocket_thrust2, 200);
rocketAnimation.addFrame(getResources().getDrawable(R.drawable.rocket_thrust3, 200);
rocketImage.setBackground(rocketAnimation);
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
rocketAnimation.start();
return true;
}
return super.onTouchEvent(event);
}

更多使用方法,可以去查看AnimationDrawable的api手冊.

另外,看了一下相關代碼,AnimationDrawable代碼不長,其父類是DrawableContainer,用于保存Drawable list,另外有一個數組保存每一幀的停頓時間。每隔一定時間,替換Drawable,重新刷新,實現動畫。

原文地址:http://blog.isming.me/2015/01/28/android-frame-animation/,轉載請注明出處。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!