歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android SurfaceView實現人物動畫

Android SurfaceView實現人物動畫

日期:2017/3/1 10:10:12   编辑:Linux編程

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

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


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

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

源代碼下載地址:

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

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

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

Copyright © Linux教程網 All Rights Reserved