Android中SurfaceView学习


SurfaceView和View的明显不同在于Surface不需要通过线程来更新视图,但在绘制之前必须使用lockCanvas方法锁定画布,并得 到画布,然后绘制,完成后用unlockCanvasAndPost方法解锁画布。SurfaceView类的事件处理和View一样。

首先来看一个简单的框架。

绘制界面类:

  1. package com.example.bonusball; 
  2.  
  3. import Android.content.Context; 
  4. import android.graphics.Canvas; 
  5. import android.graphics.Color; 
  6. import android.graphics.Paint; 
  7. import android.graphics.RectF; 
  8. import android.util.AttributeSet; 
  9. import android.view.SurfaceHolder; 
  10. import android.view.SurfaceView; 
  11.  
  12. public class CanvasView extends SurfaceView implements SurfaceHolder.Callback 
  13.     private SurfaceHolder myHolder; 
  14.     private Paint ballPaint; // Paint used to draw the cannonball  
  15.     private int screenWidth; // width of the screen  
  16.     private int screenHeight; // height of the screen  
  17.     private int ballRadius; 
  18.     private CanvasThread myThread; 
  19.     //控制循环  
  20.     private boolean isLoop; 
  21.  
  22.     public CanvasView(Context context) { 
  23.         super(context);   
  24.         // TODO Auto-generated constructor stub  
  25.         myHolder=this.getHolder(); 
  26.         myHolder.addCallback(this); 
  27.         ballPaint=new Paint(); 
  28.         ballPaint.setColor(Color.BLUE); 
  29.         isLoop = true
  30.     } 
  31.  
  32.     public void fireBall(float startX,float startY) 
  33.     { 
  34.         System.out.println("Fire"); 
  35.  
  36.     } 
  37.  
  38.     @Override 
  39.     public void surfaceChanged(SurfaceHolder holder, int format, int width, 
  40.             int height) { 
  41.         // TODO Auto-generated method stub  
  42.  
  43.  
  44.     } 
  45.     @Override 
  46.     protected void onSizeChanged(int w, int h, int oldw, int oldh) 
  47.     { 
  48.         super.onSizeChanged(w, h, oldw, oldh); 
  49.         screenWidth = w; // store the width  
  50.         screenHeight = h; // store the height  
  51.         ballRadius=w/10
  52.     } 
  53.  
  54.     @Override 
  55.     public void surfaceCreated(SurfaceHolder holder) { 
  56.         // TODO Auto-generated method stub  
  57.         myThread = new CanvasThread(); 
  58.         System.out.println("SurfaceCreated!"); 
  59.         myThread.start();   
  60.  
  61.     } 
  62.  
  63.     @Override 
  64.     public void surfaceDestroyed(SurfaceHolder holder) { 
  65.         // TODO Auto-generated method stub  
  66.         // 停止循环  
  67.         isLoop = false
  68.     } 
  69.     public void drawGameElements(Canvas canvas) 
  70.     { 
  71.         canvas.drawCircle(100100,ballRadius,ballPaint); 
  72.  
  73.     } 
  74.     private class CanvasThread extends Thread 
  75.     { 
  76.         @Override 
  77.         public void run() 
  78.         { 
  79.             while(true
  80.             { 
  81.                 synchronized( myHolder ) 
  82.                 { 
  83.  
  84.                     Canvas canvas = myHolder.lockCanvas(null);//获取画布  
  85.                     drawGameElements(canvas); 
  86.                     myHolder.unlockCanvasAndPost(canvas);//解锁画布,提交画好的图像  
  87.                     //System.out.println("run");  
  88.                 } 
  89.             } 
  90.         } 
  91.  
  92.     } 

事件处理 类:

  1. package com.example.bonusball; 
  2.  
  3. import android.os.Bundle; 
  4. import android.app.Activity; 
  5. import android.view.Menu; 
  6. import android.content.Context; 
  7. import android.graphics.Canvas; 
  8. import android.graphics.Color; 
  9. import android.graphics.Paint; 
  10. import android.graphics.Rect; 
  11. import android.view.GestureDetector; 
  12. import android.view.GestureDetector.SimpleOnGestureListener; 
  13. import android.view.MotionEvent; 
  14. import android.view.SurfaceHolder; 
  15. import android.view.SurfaceView; 
  16. import android.widget.Toast; 
  17. public class BallActivity extends Activity { 
  18.  
  19.     private GestureDetector myGestureDetector;//监听手势  
  20.     private CanvasView myCanvas; 
  21.     @Override 
  22.     public void onCreate(Bundle savedInstanceState) { 
  23.         super.onCreate(savedInstanceState); 
  24.         myCanvas=new CanvasView(this); 
  25.         setContentView(myCanvas); 
  26.         myGestureDetector = new GestureDetector(thisnew MyGestureListener()); 
  27.          
  28.     } 
  29.     @Override 
  30.     public boolean onTouchEvent(MotionEvent event) 
  31.     { 
  32.         return myGestureDetector.onTouchEvent(event); 
  33.  
  34.     } 
  35.  
  36.      
  37.     private class MyGestureListener extends SimpleOnGestureListener   
  38.     {   
  39.         public boolean onDown(MotionEvent e1) {     
  40.             Toast.makeText(getApplicationContext(), "onDown", Toast.LENGTH_SHORT).show();   
  41.             return true;     
  42.         }   
  43.          
  44.          @Override     
  45.          public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)   
  46.          { 
  47.              System.out.println("Fling"); 
  48.             return true;   
  49.          } 
  50.     } 
  51.     @Override 
  52.     public boolean onCreateOptionsMenu(Menu menu) { 
  53.         getMenuInflater().inflate(R.menu.activity_ball, menu); 
  54.         return true
  55.      
  56.     } 
  • 1
  • 2
  • 3
  • 下一页

相关内容