ball.java

package com.example.sufacedemo;


import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.DisplayMetrics;
 
/**
 * 球类
 * @author zcl
 *
 */
public class Ball {
          
         /**
          * 球的高
          */
         public static final int HEIGHT = 93;
         /**
          * 球的宽
          */
         public static final int WIDTH = 93;
         private static final int STEPLENGTH = 10;//每次运动的间距
         private static final float REDUCEPERCENTAGE =  0.35F;//递减系数
         private int stepReduce ;//每次反向运动的缩短的距离
        
         private float runX ;//球的位置
         private float runY ;//球的位置
         private BallSurfaceView bsv ;
         private boolean upDirection = false;//if true,up direction,or is down direction
         private float maxHeight ;//当前运动最高的高度
         private Paint paint ;
        
         Bitmap ballBitmap ;//球的图片
         SportActivity sa ;
         public Ball(float initX , float initY , BallSurfaceView bsv){
                   this.runX  = initX;
                   this.runY = initY ;
                   maxHeight = initY;
                   this.bsv = bsv;
                   ballBitmap = BitmapFactory.decodeResource(bsv.getResources(), R.drawable.ball);//加载图片
                   paint = new Paint();
                   sa = bsv.sportActivity;
         }
        
         public void onDraw(Canvas canvas) {
                   int c = paint.getColor();//保存颜色,之后还原为之前颜色
                   boundaryTest();
                   if(canvas != null) canvas.drawBitmap(ballBitmap,runX,runY,paint);
                   paint.setColor(c);
                   move();
         }
         /**
          * 运动
          */
         private void move() {
                   if(maxHeight >= (sa.screenHeight - HEIGHT)) {
                            return;
                   }
                   if(upDirection){//向上
                            runY = runY + STEPLENGTH ;
                   }else{
                            runY = runY - STEPLENGTH ;
                   }
         }
 
         /**
          * 边界检测,使球不会飞出边界
          */
         private void boundaryTest(){
 
                   if(runY > sa.screenHeight - HEIGHT){//向下运动到头
                            upDirection = !upDirection;//方向置反
                            runY = sa.screenHeight - HEIGHT;
                            stepReduce = (int) (maxHeight * REDUCEPERCENTAGE);
                            maxHeight = maxHeight + stepReduce ;//最大高度递减
                           
                   }
                   if(runY < maxHeight ){//向上运动到头
                            upDirection = !upDirection;//方向置反
                            if(maxHeight >= (sa.screenHeight - HEIGHT)) return;
                            runY = maxHeight ;
                           
                   }
         }
}

  

BallSurfaceView

package com.example.sufacedemo;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class BallSurfaceView extends SurfaceView implements
		SurfaceHolder.Callback {
	SportActivity sportActivity;// 调用该SurfaceView的上下文引用
	private Ball ball;// 小球
	SurfaceHolder holder;

	public BallSurfaceView(Context context) {
		super(context);
		this.sportActivity = (SportActivity) context;
		ball = new Ball(100, 100, this);
		holder = this.getHolder();
		holder.addCallback(this);
	}

	@SuppressLint("WrongCall")
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		if (canvas == null)
			canvas = holder.lockCanvas();// 锁定画布
		Paint p = new Paint();
		int c = p.getColor();
		p.setColor(Color.WHITE);// 设置背景白色
		if (canvas != null)
			canvas.drawRect(0, 0, sportActivity.screenWidth,
					sportActivity.screenHeight, p);
		p.setColor(c);
		ball.onDraw(canvas);
		holder.unlockCanvasAndPost(canvas);// 释放锁
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		new RefreshThread().start();
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {

	}

	private class RefreshThread extends Thread {

		@SuppressLint("WrongCall")
		@Override
		public void run() {

			while (true) {
				Canvas canvas = null;
				try {
					onDraw(canvas);
				} catch (Exception e) {
					e.printStackTrace();
				}

				try {
					Thread.sleep(40);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}

	}

}

  

SportActivity.java

package com.example.sufacedemo;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Window;
import android.view.WindowManager;
 
public class SportActivity extends Activity {
        
         public int screenWidth ;
         public int screenHeight ;
         BallSurfaceView bsv ;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bsv = new BallSurfaceView(this);
        //获得屏幕尺寸
        DisplayMetrics dm = new DisplayMetrics();
        dm = this.getApplicationContext().getResources().getDisplayMetrics();
              screenWidth = dm.widthPixels;
              screenHeight = dm.heightPixels;
            //下两句为设置全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
                   getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN , 
                                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
       
        setContentView(bsv);
    }
}