第一种描绘方式:使用SurfaceView类来描绘
public class MainActivity extends Activity { MySurfaceView mySurfaceView; Thread mainLoop; private MySurfaceView view; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); view = new MySurfaceView(this); super.setContentView(view); } @Override protected 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 stub setFocusable(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 stub while (true) { doDraw(); } } @Override public 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; } @Override public 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(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); view = new MySurfaceView(this); super.setContentView(view); } @Override protected 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 stub setFocusable(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(); } @Override protected 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 stub while (true) { handler.post(new Runnable() { public void run() { // TODO Auto-generated method stub invalidate();// 使窗口无效,意味着重绘,会调用ondraw方法 } }); } } @Override public 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; } @Override public 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; } } @Override public 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; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); view = new MySurfaceView(this); super.setContentView(view); } @Override protected 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 stub setFocusable(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 stub while (true) { doDraw(); } } @Override public 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; } @Override public 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; } } }