Android編程根據(jù)系列圖片繪制動畫實(shí)例總結(jié)
本文實(shí)例講述了Android編程根據(jù)系列圖片繪制動畫的方法。分享給大家供大家參考,具體如下:
一、采用系統(tǒng)提供的Animation類,用自帶的方法
其中的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對象**/ 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(); } } });
其中://設(shè)置單次播放 animationDrawable.setOneShot(true);
二、提供了很多幀動畫的圖片,利用android繪圖,可以繪制出人物走動的動畫。
如上圖,這種情況下,可以按照如下步驟,繪制動畫:
1、 根據(jù)人物上下左右行走,可以分為四段動畫,可以定義一個(gè)長度為4的動畫數(shù)組;
2、 根據(jù)鍵盤上下左右鍵事件分別觸發(fā)不同的動畫。
主要繪制的語句如下:
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);
三、只提供一張人物圖片,就要采用程序來切割該圖片,得到動畫所需要的幀圖像,
如上圖,這種情況下,可以按照如下步驟,繪制動畫:
1、通過該圖片的寬度和高度,和定義的Tile的寬度和高度,可以切割出12張所需要的幀圖像;
2、根據(jù)人物上下左右行走,可以分為四段動畫,可以定義一個(gè)長度為4的動畫數(shù)組;
3、 根據(jù)鍵盤上下左右鍵事件分別觸發(fā)不同的動畫;
切割圖片,以及繪制動畫的主要代碼如下:
//利用程序來切割圖片 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)備條件后,我們可以開始真正的繪制:
public void DrawAnimation(Canvas Canvas, Paint paint, int x, int y) { //如果沒有播放結(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)志動畫播放結(jié)束 mIsend = true; if (mIsLoop) { //設(shè)置循環(huán)播放 mIsend = false; mPlayID = 0; } } } } }
這里采用了兩個(gè)標(biāo)志位來判斷動畫的狀態(tài),mIsend判斷動畫是否播放,true結(jié)束播放,false為播放動畫;mIsloop判斷動畫是否循環(huán),true為循環(huán),false為不循環(huán);當(dāng)然,動畫循環(huán)的時(shí)候,動畫肯定是播放的,于是mIsloop為true,則mIsend為false,由于每一組動畫都為四張圖片,所以mPlayID最多為4,當(dāng)人物一組動作也就是一個(gè)動畫完成后,表示4張圖片都繪制了一遍,則要講mPlayID置為0,表示重新開始需要繪制四張圖片代表一個(gè)動畫。
我們在主類中如何通過按鍵來觸發(fā)動畫呢?需要通過實(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ù)按鍵更新顯示動畫**/ if (mAllkeyDown) { if (mIskeyDown) { mAnimationState = ANIM_DOWN; canvas.drawText("按下下鍵,開始播放向下動畫開始", 0, 20, mPaint); } else if (mIskeyLeft) { mAnimationState = ANIM_LEFT; canvas.drawText("按下左鍵,開始播放向左動畫開始", 0, 20, mPaint); } else if (mIskeyRight) { mAnimationState = ANIM_RIGHT; canvas.drawText("按下右鍵,開始播放向右動畫開始", 0, 20, mPaint); } else if (mIskeyUp) { mAnimationState = ANIM_UP; canvas.drawText("按下上鍵,開始播放向上動畫開始", 0, 20, mPaint); } /**繪制主角動畫**/ mHeroAnim[mAnimationState].DrawAnimation(canvas, mPaint, 20, 100); mTestAnim[mAnimationState].DrawAnimation(canvas, mPaint, 100, 100); }else { /**按鍵抬起后人物停止動畫**/ mHeroAnim[mAnimationState].DrawFrame(canvas, mPaint, 20, 100, 0); mTestAnim[mAnimationState].DrawFrame(canvas, mPaint, 100, 100, 0); canvas.drawText("按鍵已經(jīng)抬起動畫停止", 0, 20, mPaint); } super.onDraw(canvas); invalidate(); }
這樣,我們的動畫繪制時(shí)時(shí)刻刻都在進(jìn)行著。
我們可以通過控制上下左右按鍵,來控制標(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; }
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
Android Intent傳遞大量數(shù)據(jù)出現(xiàn)問題解決
這篇文章主要為大家介紹了Android Intent傳遞大量數(shù)據(jù)出現(xiàn)問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Android之使用Android-query框架開發(fā)實(shí)戰(zhàn)(一)
這篇文章主要介紹了Android之使用Android-query框架開發(fā)實(shí)戰(zhàn)(一)的相關(guān)資料,需要的朋友可以參考下2015-10-10Android LayoutInflater.inflate源碼分析
這篇文章主要介紹了Android LayoutInflater.inflate源碼分析的相關(guān)資料,需要的朋友可以參考下2016-12-12android的RecyclerView實(shí)現(xiàn)拖拽排序和側(cè)滑刪除示例
在平時(shí)開發(fā)應(yīng)用的時(shí)候,經(jīng)常會遇到列表排序、滑動刪除的需求。這篇文章主要介紹了android的RecyclerView實(shí)現(xiàn)拖拽排序和側(cè)滑刪除示例,有興趣的可以了解一下。2017-02-02Android巧用ActionBar實(shí)現(xiàn)下拉式導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了Android巧用ActionBar實(shí)現(xiàn)下拉式導(dǎo)航的相關(guān)資料,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05Android開發(fā)Kotlin語言協(xié)程的依賴及使用示例
這篇文章主要為大家介紹了Android開發(fā)Kotlin語言協(xié)程的依賴及使用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08