小球弹跳

1.小球类

 

package com.android.ballmove;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;

public class Ball {
 /** 
 18.          * 球的高 
 19.          */ 
          public static final int HEIGHT = 93;  
          /** 
 22.          * 球的宽 
 23.          */ 
          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();  
         }  
         /** 
 56.          * 运动 
 57.          */ 
          private void move() {  
                    if(maxHeight >= (sa.screenHeight - HEIGHT)) {  
                             return;  
                   }  
                   if(upDirection){//向上  
                             runY = runY + STEPLENGTH ;  
                    }else{  
                             runY = runY - STEPLENGTH ;  
                    }  
          }  
    
          /** 
 70.          * 边界检测,使球不会飞出边界 
 71.          */ 
          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 ;  
                              
                   }  
         }  
 } 

 

2.小球弹跳的过程

 

package com.android.ballmove;

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);  
         }  
   
         @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.GRAY);//设置背景白色  
                   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{  
   
                   @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();  
                                     }  
                            }  
                   }  
                    
        }  
   


 

3.Activity

 

package com.android.ballmove;

import android.app.Activity;
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);  
      }  

查看评论
1楼 fangliang201110 2011-10-24 17:14发表 [回复] [引用] [举报]
posted @ 2012-10-28 11:07  白婷  阅读(174)  评论(0编辑  收藏  举报