歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android SurfaceView實現人物動畫

經常看到別人的游戲中有人物跑動的效果,對這個東西很好奇,剛好群裡上傳了“忍者突襲”的代碼,我看了裡面的代碼,但對畫人物那段還是沒咋弄,所以自己寫一個測試程序,程序中使用到的圖片資源是來自“忍者突襲”的代碼,真心的感謝寫“忍者突襲”代碼的人~~

人物角色使用的圖片如下:


在畫人物角色時會對這張圖片進行剪切,使用的函數是

mCanvas.clipRect(mClipRect);
繪制人物角色的思想是使用mCanvas.clipRect(mClipRect);函數來設置畫布顯示的位置及大小,假設為(presentX,presentY,presentX + width/10, presentY + height)(presentX和presentY為現在圖片的位置,width和height為圖片的寬度和高度),然後使用mCanvas.drawBitmap來繪制圖片,第一次繪制圖片的位置是(presentX,presentY),然後將繪制圖片的位置修改為(presentX - width / 10, presentY),第二次設置的畫布顯示的位置仍然是presentX,presentY,presentX + width/10, presentY + height,繪制圖片的位置是(presentX - width / 10, presentY),而第二張圖片的位置剛好是presentX,presentY,所以顯示的是第二張圖片,依次類推的實現其它圖片的顯示。

實例代碼如下:

  1. package com.example.runmanenvironmenttest;  
  2.   
  3. import Android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Color;  
  8. import android.graphics.Paint;  
  9. import android.graphics.Rect;  
  10. import android.util.AttributeSet;  
  11. import android.view.SurfaceHolder;  
  12. import android.view.SurfaceView;  
  13.   
  14. public class MyView extends SurfaceView implements SurfaceHolder.Callback, Runnable{  
  15.   
  16.     private SurfaceHolder holder;    
  17.     private Canvas mCanvas;  
  18.       
  19.     private Bitmap mBg1;  
  20.       
  21.     private Bitmap mPlay1;  
  22.       
  23.     private int mWidth;  
  24.     private int mHeight;  
  25.       
  26.     private Paint mPaint;  
  27.       
  28.     private String tag = "xiao";  
  29.       
  30.     private BitmapFactory.Options ops;  
  31.     private Rect mRect;  
  32.     private Rect mClipRect;  
  33.     private int mPosition = 20;  
  34.     private int mPicPosition = 0;  
  35.     private int mStep = 5;  
  36.     private int mBamHeight = 600;  
  37.       
  38.     public MyView(Context context, AttributeSet attrs) {  
  39.         super(context, attrs);  
  40.         // TODO Auto-generated constructor stub   
  41.         holder = this.getHolder();    
  42.         holder.addCallback(this);  
  43.         mPaint = new Paint();  
  44.         mPaint.setColor(Color.YELLOW);  
  45.           
  46.         ops = new BitmapFactory.Options();  
  47.         mBg1 = BitmapFactory.decodeResource(this.getResources(),  
  48.                 R.drawable.bg1, ops);  
  49.          
  50.         mPlay1 = BitmapFactory.decodeResource(getResources(), R.drawable.dartman, ops);  
  51.     }  
  52.       
  53.     @Override  
  54.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  55.             int height) {  
  56.         // TODO Auto-generated method stub   
  57.         mWidth = width;  
  58.         mHeight = height;  
  59.         mRect = new Rect(00, mWidth, mHeight);  
  60.           
  61.         new Thread(this).start();  
  62.     }  
  63.   
  64.     @Override  
  65.     public void surfaceCreated(SurfaceHolder holder) {  
  66.         // TODO Auto-generated method stub   
  67.           
  68.     }  
  69.   
  70.     @Override  
  71.     public void surfaceDestroyed(SurfaceHolder holder) {  
  72.         // TODO Auto-generated method stub   
  73.           
  74.     }  
  75.   
  76.     @Override  
  77.     public void run() {  
  78.         // TODO Auto-generated method stub   
  79.         //myDraw();   
  80.         while(true){  
  81.             try {  
  82.                 mClipRect = new Rect(mPosition * mStep + mPlay1.getWidth() / 10, mBamHeight,mPosition * mStep + 2 * mPlay1.getWidth() / 10, mBamHeight - mPlay1.getHeight());  
  83.                 mCanvas = holder.lockCanvas();  
  84.                 if (mCanvas != null) {  
  85.                     mCanvas.drawBitmap(mBg1, null,mRect, mPaint);  
  86.                       
  87.                     mCanvas.save();  
  88.                     mCanvas.clipRect(mClipRect);  
  89.                     mCanvas.drawBitmap(mPlay1, mPlay1.getWidth() / 10 + mPosition * mStep - mPicPosition * mPlay1.getWidth() / 10, mBamHeight - mPlay1.getHeight(), mPaint);  
  90.                     mCanvas.restore();  
  91.                     mPicPosition++;  
  92.                     if(mPosition * mStep > mWidth){  
  93.                         mPosition = 0;  
  94.                     }  
  95.                     if(mPicPosition > 9){  
  96.                         mPicPosition = 0;  
  97.                     }  
  98.                 }  
  99.       
  100.             } catch (Exception e) {  
  101.                 e.printStackTrace();  
  102.             } finally {  
  103.                 if (mCanvas != null) {  
  104.                     holder.unlockCanvasAndPost(mCanvas);  
  105.                 }  
  106.             }  
  107.             try {  
  108.                 Thread.sleep(1000);  
  109.             } catch (InterruptedException e) {  
  110.                 // TODO Auto-generated catch block   
  111.                 e.printStackTrace();  
  112.             }  
  113.         }  
  114.     }  
  115. }  

源代碼下載地址:

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2012年資料/9月/13日/Android SurfaceView實現人物動畫

Copyright © Linux教程網 All Rights Reserved