package com.example.android.surfaceview; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.Display; import android.view.MotionEvent; import android.view.SurfaceView; import android.view.WindowManager; public class MyGame extends Activity { MyView view; Thread mainThread; //Boolean isRunning; class MyView extends SurfaceView implements Runnable { Bitmap droid; int d_x, d_y, d_dx, d_dy; public MyView(Context context) { super(context); droid = BitmapFactory.decodeResource(context.getResources(), R.drawable.droid); Display disp = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); d_x = (disp.getWidth() - droid.getWidth()) / 2; d_y = (disp.getHeight() - droid.getHeight()) / 2 - 20; mainThread = new Thread(this); mainThread.start(); } void doDraw() { //Log.d("MyGame", "doDraw()"); Canvas canvas = getHolder().lockCanvas(); if (canvas != null) { if (d_x > canvas.getWidth()) d_x = - droid.getWidth(); else if (d_x < - droid.getWidth()) d_x = canvas.getWidth(); if (d_y > canvas.getHeight()) d_y = - droid.getHeight(); else if (d_y < - droid.getHeight()) d_y = canvas.getHeight(); canvas.drawColor(Color.BLACK); canvas.drawBitmap(droid, d_x, d_y, null); getHolder().unlockCanvasAndPost(canvas); } } @Override public boolean onTouchEvent(MotionEvent event) { Log.d("MyGame", "onTouchEvent()"); int x = d_x + droid.getWidth() / 2; int y = d_y + droid.getHeight() / 2; d_dx += (event.getX() - x) / 50; d_dy += (event.getY() - y) / 50; return true; } public void run() { while (true) { d_x += d_dx; d_y += d_dy; doDraw(); try { Thread.sleep(100); } catch (InterruptedException e) {} } } } @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("My Game"); view = new MyView(this); setContentView(view); } @Override protected void onDestroy() { super.onDestroy(); if (mainThread != null && mainThread.isAlive()) { mainThread.interrupt(); } } }