Android編程根據(jù)系列圖片繪制動(dòng)畫(huà)實(shí)例總結(jié)
本文實(shí)例講述了Android編程根據(jù)系列圖片繪制動(dòng)畫(huà)的方法。分享給大家供大家參考,具體如下:
一、采用系統(tǒng)提供的Animation類(lèi),用自帶的方法

其中的animation.xml文件如下:
<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>
AnimationDrawable animationDrawable = null;
/**拿到ImageView對(duì)象**/
imageView = (ImageView)findViewById(R.id.imageView);
/**通過(guò)ImageView對(duì)象拿到背景顯示的AnimationDrawable**/
animationDrawable = (AnimationDrawable) imageView.getBackground();
/**開(kāi)始播放動(dòng)畫(huà)**/
button0 = (Button)findViewById(R.id.button0);
button0.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
/**播放動(dòng)畫(huà)**/
if(!animationDrawable.isRunning()) {
animationDrawable.start();
}
}
});
其中://設(shè)置單次播放 animationDrawable.setOneShot(true);
二、提供了很多幀動(dòng)畫(huà)的圖片,利用android繪圖,可以繪制出人物走動(dòng)的動(dòng)畫(huà)。

如上圖,這種情況下,可以按照如下步驟,繪制動(dòng)畫(huà):
1、 根據(jù)人物上下左右行走,可以分為四段動(dòng)畫(huà),可以定義一個(gè)長(zhǎng)度為4的動(dòng)畫(huà)數(shù)組;
2、 根據(jù)鍵盤(pán)上下左右鍵事件分別觸發(fā)不同的動(dòng)畫(huà)。
主要繪制的語(yǔ)句如下:
mHeroAnim[ANIM_DOWN] = new Animation(context,new int []{R.drawable.hero_down_a,R.drawable.hero_down_b,R.drawable.hero_down_c,R.drawable.hero_down_d},true);
mHeroAnim[ANIM_LEFT] = new Animation(context,new int []{R.drawable.hero_left_a,R.drawable.hero_left_b,R.drawable.hero_left_c,R.drawable.hero_left_d},true);
mHeroAnim[ANIM_RIGHT]= new Animation(context,new int []{R.drawable.hero_right_a,R.drawable.hero_right_b,R.drawable.hero_right_c,R.drawable.hero_right_d},true);
mHeroAnim[ANIM_UP] = new Animation(context,new int []{R.drawable.hero_up_a,R.drawable.hero_up_b,R.drawable.hero_up_c,R.drawable.hero_up_d},true);
三、只提供一張人物圖片,就要采用程序來(lái)切割該圖片,得到動(dòng)畫(huà)所需要的幀圖像,

如上圖,這種情況下,可以按照如下步驟,繪制動(dòng)畫(huà):
1、通過(guò)該圖片的寬度和高度,和定義的Tile的寬度和高度,可以切割出12張所需要的幀圖像;
2、根據(jù)人物上下左右行走,可以分為四段動(dòng)畫(huà),可以定義一個(gè)長(zhǎng)度為4的動(dòng)畫(huà)數(shù)組;
3、 根據(jù)鍵盤(pán)上下左右鍵事件分別觸發(fā)不同的動(dòng)畫(huà);
切割圖片,以及繪制動(dòng)畫(huà)的主要代碼如下:
//利用程序來(lái)切割圖片
Bitmap testmap = ReadBitMap(context,R.drawable.enemy);
Bitmap [][]bitmap = new Bitmap[ANIM_COUNT][ANIM_COUNT];
int tileWidth = testmap.getWidth() / ANIM_COUNT;
int tileHeight = testmap.getHeight() / ANIM_COUNT;
int i = 0,x = 0,y = 0;
for(i =0; i < ANIM_COUNT; i++) {
y = 0;
bitmap[ANIM_DOWN][i] = BitmapClipBitmap(testmap,x,y,tileWidth,tileHeight);
y+=tileHeight;
bitmap[ANIM_LEFT][i] = BitmapClipBitmap(testmap,x,y,tileWidth,tileHeight);
y+=tileHeight;
bitmap[ANIM_RIGHT][i] = BitmapClipBitmap(testmap,x,y,tileWidth,tileHeight);
y+=tileHeight;
bitmap[ANIM_UP][i] = BitmapClipBitmap(testmap,x,y,tileWidth,tileHeight);
x+= tileWidth;
}
mTestAnim[ANIM_DOWN] = new Animation(context,bitmap[ANIM_DOWN],true);
mTestAnim[ANIM_LEFT] = new Animation(context,bitmap[ANIM_LEFT],true);
mTestAnim[ANIM_RIGHT]= new Animation(context,bitmap[ANIM_RIGHT],true);
mTestAnim[ANIM_UP] = new Animation(context,bitmap[ANIM_UP],true);
注意:以上后面兩種方式分別采用了不同的繪制方法
第一種的繪制構(gòu)造方法為:Animation(Context context, int [] frameBitmapID, boolean isloop);
第二種的繪制構(gòu)造方法為:Animation(Context context, Bitmap [] frameBitmap, boolean isloop);
有了這些準(zhǔn)備條件后,我們可以開(kāi)始真正的繪制:
public void DrawAnimation(Canvas Canvas, Paint paint, int x, int y) {
//如果沒(méi)有播放結(jié)束則繼續(xù)播放
if (!mIsend) {
Canvas.drawBitmap(mframeBitmap[mPlayID], x, y, paint);
long time = System.currentTimeMillis();
if (time - mLastPlayTime > ANIM_TIME) {
mPlayID++;
mLastPlayTime = time;
if (mPlayID >= mFrameCount) {
//標(biāo)志動(dòng)畫(huà)播放結(jié)束
mIsend = true;
if (mIsLoop) {
//設(shè)置循環(huán)播放
mIsend = false;
mPlayID = 0;
}
}
}
}
}
這里采用了兩個(gè)標(biāo)志位來(lái)判斷動(dòng)畫(huà)的狀態(tài),mIsend判斷動(dòng)畫(huà)是否播放,true結(jié)束播放,false為播放動(dòng)畫(huà);mIsloop判斷動(dòng)畫(huà)是否循環(huán),true為循環(huán),false為不循環(huán);當(dāng)然,動(dòng)畫(huà)循環(huán)的時(shí)候,動(dòng)畫(huà)肯定是播放的,于是mIsloop為true,則mIsend為false,由于每一組動(dòng)畫(huà)都為四張圖片,所以mPlayID最多為4,當(dāng)人物一組動(dòng)作也就是一個(gè)動(dòng)畫(huà)完成后,表示4張圖片都繪制了一遍,則要講mPlayID置為0,表示重新開(kāi)始需要繪制四張圖片代表一個(gè)動(dòng)畫(huà)。
我們?cè)谥黝?lèi)中如何通過(guò)按鍵來(lái)觸發(fā)動(dòng)畫(huà)呢?需要通過(guò)實(shí)現(xiàn)onDraw()方法,并且不斷的重繪,主要代碼如下:
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mMapImage, 0,0, mPaint);
canvas.save();
canvas.clipRect(0, 0,320, 30);
mPaint.setColor(Color.WHITE);
canvas.drawRect(0, 0,480, 30, mPaint);
mPaint.setColor(Color.RED);
canvas.restore();
/**根據(jù)按鍵更新顯示動(dòng)畫(huà)**/
if (mAllkeyDown) {
if (mIskeyDown) {
mAnimationState = ANIM_DOWN;
canvas.drawText("按下下鍵,開(kāi)始播放向下動(dòng)畫(huà)開(kāi)始", 0, 20, mPaint);
} else if (mIskeyLeft) {
mAnimationState = ANIM_LEFT;
canvas.drawText("按下左鍵,開(kāi)始播放向左動(dòng)畫(huà)開(kāi)始", 0, 20, mPaint);
} else if (mIskeyRight) {
mAnimationState = ANIM_RIGHT;
canvas.drawText("按下右鍵,開(kāi)始播放向右動(dòng)畫(huà)開(kāi)始", 0, 20, mPaint);
} else if (mIskeyUp) {
mAnimationState = ANIM_UP;
canvas.drawText("按下上鍵,開(kāi)始播放向上動(dòng)畫(huà)開(kāi)始", 0, 20, mPaint);
}
/**繪制主角動(dòng)畫(huà)**/
mHeroAnim[mAnimationState].DrawAnimation(canvas, mPaint, 20, 100);
mTestAnim[mAnimationState].DrawAnimation(canvas, mPaint, 100, 100);
}else {
/**按鍵抬起后人物停止動(dòng)畫(huà)**/
mHeroAnim[mAnimationState].DrawFrame(canvas, mPaint, 20, 100, 0);
mTestAnim[mAnimationState].DrawFrame(canvas, mPaint, 100, 100, 0);
canvas.drawText("按鍵已經(jīng)抬起動(dòng)畫(huà)停止", 0, 20, mPaint);
}
super.onDraw(canvas);
invalidate();
}
這樣,我們的動(dòng)畫(huà)繪制時(shí)時(shí)刻刻都在進(jìn)行著。
我們可以通過(guò)控制上下左右按鍵,來(lái)控制標(biāo)志:
public void setKeyState(int keyCode, boolean state) {
switch(keyCode) {
case KeyEvent.KEYCODE_DPAD_DOWN:
mIskeyDown = state;
break;
case KeyEvent.KEYCODE_DPAD_UP:
mIskeyUp = state;
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
mIskeyLeft = state;
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
mIskeyRight = state;
break;
}
mAllkeyDown = state;
}
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- android實(shí)現(xiàn)圖片閃爍動(dòng)畫(huà)效果的兩種實(shí)現(xiàn)方式(實(shí)用性高)
- Android編程實(shí)現(xiàn)ImageView圖片拋物線(xiàn)動(dòng)畫(huà)效果的方法
- android 簡(jiǎn)單圖片動(dòng)畫(huà)播放的實(shí)例代碼
- Android Tween動(dòng)畫(huà)之RotateAnimation實(shí)現(xiàn)圖片不停旋轉(zhuǎn)效果實(shí)例介紹
- Android圖片翻轉(zhuǎn)動(dòng)畫(huà)簡(jiǎn)易實(shí)現(xiàn)代碼
- Android播放多張圖片形成的一個(gè)動(dòng)畫(huà)示例
相關(guān)文章
Android 滑動(dòng)定位和吸附懸停效果實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 滑動(dòng)定位和吸附懸停效果實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
android全屏去掉title欄的多種實(shí)現(xiàn)方法
android全屏去掉title欄包括以下幾個(gè)部分:實(shí)現(xiàn)應(yīng)用中的所有activity都全屏/實(shí)現(xiàn)單個(gè)activity全屏/實(shí)現(xiàn)單個(gè)activity去掉title欄/自定義標(biāo)題內(nèi)容/自定義標(biāo)題布局等等感興趣的可參考下啊2013-02-02
Android ViewGroup事件分發(fā)和處理源碼分析
Android開(kāi)發(fā)實(shí)現(xiàn)布局中為控件添加選擇器的方法
Android編程開(kāi)發(fā)錄音和播放錄音簡(jiǎn)單示例
Android實(shí)現(xiàn)listview滑動(dòng)時(shí)漸隱漸現(xiàn)頂部欄實(shí)例代碼
Android使用 Spinner控件實(shí)現(xiàn)下拉框功能
Android簡(jiǎn)單的利用MediaRecorder進(jìn)行錄音的實(shí)例代碼

