第一種描繪方式:使用SurfaceView類來描繪
public class MainActivity extends Activity {MySurfaceView mySurfaceView;Thread mainLoop;private MySurfaceView view;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);view = new MySurfaceView(this);super.setContentView(view);}@Overrideprotected void onDestroy() {super.onDestroy();Thread.interrupted();}class MySurfaceView extends SurfaceView implements Runnable {Bitmap bitmap;boolean u, d, l, r;Paint paint = new Paint();int left, top;long time;int tx, ty;public MySurfaceView(Context context) {super(context);// TODO Auto-generated constructor stubsetFocusable(true);requestFocus();// 請求聚焦bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher);paint.setColor(Color.RED);tx = bitmap.getWidth();ty = bitmap.getHeight() / 2;mainLoop = new Thread(this);mainLoop.start();}void doDraw() {Canvas canvas = getHolder().lockCanvas();if (canvas != null) {canvas.drawColor(Color.WHITE);if (u)top--;if (d)top++;if (l)left--;if (r)left++;canvas.drawBitmap(bitmap, left * 10, top * 10, paint);long now = System.currentTimeMillis();System.out.println(now - time);canvas.drawText(1000f / (now - time) + "fps", tx, ty, paint);time = now;getHolder().unlockCanvasAndPost(canvas);}}public void run() {// TODO Auto-generated method stubwhile (true) {doDraw();}}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_DPAD_UP:u = true;break;case KeyEvent.KEYCODE_DPAD_DOWN:d = true;break;case KeyEvent.KEYCODE_DPAD_LEFT:l = true;break;case KeyEvent.KEYCODE_DPAD_RIGHT:r = true;break;default:return false;}return true;}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_DPAD_UP:u = false;break;case KeyEvent.KEYCODE_DPAD_DOWN:d = false;break;case KeyEvent.KEYCODE_DPAD_LEFT:l = false;break;case KeyEvent.KEYCODE_DPAD_RIGHT:r = false;break;default:return false;}return true;}}}
第二種描繪方式:使用View類來描繪。
public class MainActivity extends Activity {MySurfaceView mySurfaceView;Thread mainLoop;private MySurfaceView view;Handler handler = new Handler(); @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);view = new MySurfaceView(this);super.setContentView(view);}@Overrideprotected void onDestroy() {super.onDestroy();Thread.interrupted();}class MySurfaceView extends View implements Runnable {Bitmap bitmap;boolean u, d, l, r;Paint paint = new Paint();int left, top;long time;int tx, ty;public MySurfaceView(Context context) {super(context);// TODO Auto-generated constructor stubsetFocusable(true);requestFocus();// 請求聚焦bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher);paint.setColor(Color.RED);tx = bitmap.getWidth();ty = bitmap.getHeight() / 2;mainLoop = new Thread(this);mainLoop.start();}@Overrideprotected void onDraw(Canvas canvas) {if (canvas != null) {canvas.drawColor(Color.WHITE);if (u)top--;if (d)top++;if (l)left--;if (r)left++;canvas.drawBitmap(bitmap, left * 10, top * 10, paint);long now = System.currentTimeMillis();System.out.println(now - time);canvas.drawText(1000f / (now - time) + "fps", tx, ty, paint);time = now;}} public void run() {// TODO Auto-generated method stubwhile (true) {handler.post(new Runnable() {public void run() {// TODO Auto-generated method stubinvalidate();// 使視窗無效,意味著重繪,會調用ondraw方法}});}}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_DPAD_UP:u = true;break;case KeyEvent.KEYCODE_DPAD_DOWN:d = true;break;case KeyEvent.KEYCODE_DPAD_LEFT:l = true;break;case KeyEvent.KEYCODE_DPAD_RIGHT:r = true;break;default:return false;}return true;}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_DPAD_UP:u = false;break;case KeyEvent.KEYCODE_DPAD_DOWN:d = false;break;case KeyEvent.KEYCODE_DPAD_LEFT:l = false;break;case KeyEvent.KEYCODE_DPAD_RIGHT:r = false;break;default:return false;}return true;}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_main, menu);return true;}}
第三種描繪方式:使用BItmapDrawable類描繪
public class MainActivity extends Activity {MySurfaceView mySurfaceView;Thread mainLoop;private MySurfaceView view;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);view = new MySurfaceView(this);super.setContentView(view);}@Overrideprotected void onDestroy() {super.onDestroy();Thread.interrupted();}class MySurfaceView extends SurfaceView implements Runnable {BitmapDrawable bd;Bitmap bitmap;boolean u, d, l, r;Paint paint = new Paint();int left, top;long time;int tx, ty;int imageWidth, imageHeight;public MySurfaceView(Context context) {super(context);// TODO Auto-generated constructor stubsetFocusable(true);requestFocus();// 請求聚焦bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher);paint.setColor(Color.RED); bd = new BitmapDrawable(context.getResources(), bitmap);tx = bitmap.getWidth();ty = bitmap.getHeight() / 2; imageWidth = bitmap.getWidth(); imageHeight = bitmap.getHeight();mainLoop = new Thread(this);mainLoop.start();}public void doDraw() {Canvas canvas = getHolder().lockCanvas();if (canvas != null) {canvas.drawColor(Color.WHITE);if (u)top--;if (d)top++;if (l)left--;if (r)left++;bd.draw(canvas); bd.setBounds(left * 10, top * 10, left * 10 + imageWidth, top* 10 + imageHeight);long now = System.currentTimeMillis();System.out.println(now - time);canvas.drawText(1000f / (now - time) + "fps", tx, ty, paint);time = now;getHolder().unlockCanvasAndPost(canvas);}}public void run() {// TODO Auto-generated method stubwhile (true) {doDraw();}}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_DPAD_UP:u = true;break;case KeyEvent.KEYCODE_DPAD_DOWN:d = true;break;case KeyEvent.KEYCODE_DPAD_LEFT:l = true;break;case KeyEvent.KEYCODE_DPAD_RIGHT:r = true;break;default:return false;}return true;}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_DPAD_UP:u = false;break;case KeyEvent.KEYCODE_DPAD_DOWN:d = false;break;case KeyEvent.KEYCODE_DPAD_LEFT:l = false;break;case KeyEvent.KEYCODE_DPAD_RIGHT:r = false;break;default:return false;}return true;}}}