• 小球弹跳


    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发表 [回复] [引用] [举报]
  • 相关阅读:
    [转] egg(28)--mongoose使用聚合管道
    [转] mongoose的populate
    [转]express常用中间件
    [转] SuperAgent使用文档
    [转] node爬虫之gbk网页中文乱码解决方案
    [转] js日期对象Date对象方法 时间方法
    [转] Nodejs学习笔记(十四)— Mongoose介绍和入门
    [转] 深入理解vue 一些底层原理
    [转] Nginx之八 URL重写(rewrite)配置
    随笔
  • 原文地址:https://www.cnblogs.com/baiting/p/5346391.html
Copyright © 2020-2023  润新知