|
Android開發(fā)中在制作2D幀動畫中提供了使用XML配置動畫文件的方式繪制,也就是說Android底層提供了動畫播放的接口,那么我們分析一下如何調(diào)用它的接口來繪制動畫。首先在工程res資源文件夾下創(chuàng)建anim動畫文件夾,在這個文件夾中建立一個animation.xml文件, 這樣它的路徑就為re/anim/animation.xml。
看看內(nèi)容應(yīng)該是很好理解的,<animation-list>為動畫的總標(biāo)簽,這里面放著幀動畫 <item>標(biāo)簽,也就是說若干<item>標(biāo)簽的幀 組合在一起就是幀動畫了。<animation-list > 標(biāo)簽中android:oneshot="false" 這是一個非常重要的屬性,默認(rèn)為false 表示 動畫循環(huán)播放, 如果這里寫true 則表示動畫只播發(fā)一次。 <item>標(biāo)簽中記錄著每一幀的信息android:drawable="@drawable/a"表示這一幀用的圖片為"a",下面以此類推。 android:duration="100" 表示這一幀持續(xù)100毫秒,可以根據(jù)這個值來調(diào)節(jié)動畫播放的速度。 - <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/a" android:duration="100" />
<item android:drawable="@drawable/b" android:duration="100" />
<item android:drawable="@drawable/c" android:duration="100" />
<item android:drawable="@drawable/d" android:duration="100" />
<item android:drawable="@drawable/e" android:duration="100" />
<item android:drawable="@drawable/f" android:duration="100" />
<item android:drawable="@drawable/g" android:duration="100" />
<item android:drawable="@drawable/h" android:duration="100" />
<item android:drawable="@drawable/i" android:duration="100" />
<item android:drawable="@drawable/j" android:duration="100" />
</animation-list>
復(fù)制代碼 下面這個例子的內(nèi)容為 播放動畫 與關(guān)閉動畫 、設(shè)置播放類型 單次還是循環(huán)、拖動進度條修改動畫的透明度,廢話不多說直接進正題~~
- <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/button0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放動畫"
/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止動畫"
/>
</LinearLayout>
<RadioGroup android:id="@+id/radiogroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/checkbox0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="單次播放"
/>
<RadioButton
android:id="@+id/checkbox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="循環(huán)播放"
/>
</RadioGroup>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拖動進度條修改透明度(0 - 255)之間"
/>
<SeekBar
android:id="@+id/seekBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="256"
android:progress="256"/>
<ImageView
android:id="@+id/imageView"
android:background="@anim/animation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
復(fù)制代碼 這是一個比較簡單的布局文件,應(yīng)該都能看懂吧。 我主要說一下 最后的這個 ImageView, 它就是用來顯示我們的動畫。 這里使用android:background="@anim/animation"設(shè)置這個ImageView現(xiàn)實的背景為一個動畫,動畫資源的路徑為res/anim/animation.xml ,當(dāng)然 設(shè)置background同樣也可以在代碼中設(shè)置。 - imageView.setBackgroundResource(R.anim.animation);
復(fù)制代碼 通過getBackground方法就可以拿到這個animationDrawable對象。 - /**拿到ImageView對象**/
imageView = (ImageView)findViewById(R.id.imageView);
/**通過ImageView對象拿到背景顯示的AnimationDrawable**/
animationDrawable = (AnimationDrawable) imageView.getBackground();
復(fù)制代碼 AnimationDrawable 就是用來控制這個幀動畫,這個類中提供了很多方法。
animationDrawable.start(); 開始這個動畫
animationDrawable.stop(); 結(jié)束這個動畫
animationDrawable.setAlpha(100);設(shè)置動畫的透明度, 取值范圍(0 - 255)
animationDrawable.setOneShot(true); 設(shè)置單次播放
animationDrawable.setOneShot(false); 設(shè)置循環(huán)播放
animationDrawable.isRunning(); 判斷動畫是否正在播放
animationDrawable.getNumberOfFrames(); 得到動畫的幀數(shù)。
將這個例子的完整代碼貼上 - import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class SimpleActivity extends Activity {
/**播放動畫按鈕**/
Button button0 = null;
/**停止動畫按鈕**/
Button button1 = null;
/**設(shè)置動畫循環(huán)選擇框**/
RadioButton radioButton0= null;
RadioButton radioButton1= null;
RadioGroup radioGroup = null;
/**拖動圖片修改Alpha值**/
SeekBar seekbar = null;
/**繪制動畫View**/
ImageView imageView = null;
/**繪制動畫對象**/
AnimationDrawable animationDrawable = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple);
/**拿到ImageView對象**/
imageView = (ImageView)findViewById(R.id.imageView);
/**通過ImageView對象拿到背景顯示的AnimationDrawable**/
animationDrawable = (AnimationDrawable) imageView.getBackground();
/**開始播放動畫**/
button0 = (Button)findViewById(R.id.button0);
button0.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
/**播放動畫**/
if(!animationDrawable.isRunning()) {
animationDrawable.start();
}
}
});
/**停止播放動畫**/
button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
/**停止動畫**/
if(animationDrawable.isRunning()) {
animationDrawable.stop();
}
}
});
/**單次播放**/
radioButton0 = (RadioButton)findViewById(R.id.checkbox0);
/**循環(huán)播放**/
radioButton1 = (RadioButton)findViewById(R.id.checkbox1);
/**單選列表組**/
radioGroup = (RadioGroup)findViewById(R.id.radiogroup);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int checkID) {
if(checkID == radioButton0.getId()) {
//設(shè)置單次播放
animationDrawable.setOneShot(true);
}else if (checkID == radioButton1.getId()) {
//設(shè)置循環(huán)播放
animationDrawable.setOneShot(false);
}
//發(fā)生改變后讓動畫重新播放
animationDrawable.stop();
animationDrawable.start();
}
});
/**監(jiān)聽的進度條修改透明度**/
seekbar = (SeekBar)findViewById(R.id.seekBar);
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean frameTouch) {
/**設(shè)置動畫Alpha值**/
animationDrawable.setAlpha(progress);
/**通知imageView 刷新屏幕**/
imageView.postInvalidate();
}
});
}
}
復(fù)制代碼 拖動進度條設(shè)置Alpha值的時候 一定要使用 imageView.postInvalidate(); 方法來通知UI線程重繪屏幕中的imageView 否則會看不到透明的效果 。這里切記切記~~
總的來說這章內(nèi)容還是比較簡單的。老規(guī)矩每篇文章都會附帶源代碼,最后如果你還是覺得我寫的不夠詳細 看的不夠爽 不要緊我把源代碼的下載地址貼出來 歡迎大家一起討論學(xué)習(xí)第三十一講 fram游戲動畫.rar(255.38 KB, 下載次數(shù): 378)[/I]2011-9-6 20:36 上傳點擊文件名 下載積分: 下載豆 -2
|
上一篇: Androidr 登錄框下一篇: 在Ubuntu上為Android系統(tǒng)編寫Linux內(nèi)核驅(qū)動程序
|