AndroidSurfaceView

 

下面就贴上一个小程序代码,主要运用SurfaceView来实现在屏幕上画一个圆,你可以通过按方向键和触摸屏幕来改变圆的位置


代码:

Activity

 

  1. package com.view;  
  2.    
  3.  import android.app.Activity;  
  4.  import android.os.Bundle;  
  5.  import android.view.Window;  
  6.  import android.view.WindowManager;  
  7.    
  8.  public class MainActivity extends Activity {  
  9.      /** Called when the activity is first created. */  
  10.      @Override  
  11.      public void onCreate(Bundle savedInstanceState) {  
  12.          super.onCreate(savedInstanceState);  
  13.    
  14.          // 隐藏状态栏  
  15.          this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  16.                  WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  17.    
  18.          // 把Activity的标题去掉  
  19.          requestWindowFeature(Window.FEATURE_NO_TITLE);  
  20.    
  21.          // 设置布局  
  22.          this.setContentView(new MySurfaceView(this));  
  23.      }  
  24.  }  

 

SurfaceView

 

  1. package com.view;  
  2.    
  3.  import android.content.Context;  
  4.  import android.graphics.Canvas;  
  5.  import android.graphics.Color;  
  6.  import android.graphics.Paint;  
  7.  import android.view.KeyEvent;  
  8.  import android.view.MotionEvent;  
  9.  import android.view.SurfaceHolder;  
  10.  import android.view.SurfaceHolder.Callback;  
  11.  import android.view.SurfaceView;  
  12.    
  13.  public class MySurfaceView extends SurfaceView implements Runnable, Callback {  
  14.    
  15.      private SurfaceHolder mHolder; // 用于控制SurfaceView  
  16.    
  17.      private Thread t; // 声明一条线程  
  18.    
  19.      private boolean flag; // 线程运行的标识,用于控制线程  
  20.    
  21.      private Canvas mCanvas; // 声明一张画布  
  22.    
  23.      private Paint p; // 声明一支画笔  
  24.    
  25.      private int x = 50, y = 50, r = 10// 圆的坐标和半径  
  26.    
  27.      public MySurfaceView(Context context) {  
  28.          super(context);  
  29.    
  30.          mHolder = getHolder(); // 获得SurfaceHolder对象  
  31.          mHolder.addCallback(this); // 为SurfaceView添加状态监听  
  32.          p = new Paint(); // 创建一个画笔对象  
  33.          p.setColor(Color.WHITE); // 设置画笔的颜色为白色  
  34.          setFocusable(true); // 设置焦点  
  35.      }  
  36.    
  37.      /** 
  38.       * 自定义一个方法,在画布上画一个圆 
  39.       */  
  40.      public void Draw() {  
  41.          mCanvas = mHolder.lockCanvas(); // 获得画布对象,开始对画布画画  
  42.          mCanvas.drawRGB(000); // 把画布填充为黑色  
  43.          mCanvas.drawCircle(x, y, r, p); // 画一个圆  
  44.          mHolder.unlockCanvasAndPost(mCanvas); // 完成画画,把画布显示在屏幕上  
  45.      }  
  46.    
  47.      /** 
  48.       * 当SurfaceView创建的时候,调用此函数 
  49.       */  
  50.      @Override  
  51.      public void surfaceCreated(SurfaceHolder holder) {  
  52.          t = new Thread(this); // 创建一个线程对象  
  53.          flag = true// 把线程运行的标识设置成true  
  54.          t.start(); // 启动线程  
  55.      }  
  56.    
  57.      /** 
  58.       * 当SurfaceView的视图发生改变的时候,调用此函数 
  59.       */  
  60.      @Override  
  61.      public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  62.              int height) {  
  63.      }  
  64.    
  65.      /** 
  66.       * 当SurfaceView销毁的时候,调用此函数 
  67.       */  
  68.      @Override  
  69.      public void surfaceDestroyed(SurfaceHolder holder) {  
  70.          flag = false// 把线程运行的标识设置成false  
  71.      }  
  72.    
  73.      /** 
  74.       * 当屏幕被触摸时调用 
  75.       */  
  76.      @Override  
  77.      public boolean onTouchEvent(MotionEvent event) {  
  78.          x = (int) event.getX(); // 获得屏幕被触摸时对应的X轴坐标  
  79.          y = (int) event.getY(); // 获得屏幕被触摸时对应的Y轴坐标  
  80.          return true;  
  81.      }  
  82.        
  83.      /** 
  84.       * 当用户按键时调用 
  85.       */  
  86.      @Override  
  87.      public boolean onKeyDown(int keyCode, KeyEvent event) {  
  88.          if(keyCode == KeyEvent.KEYCODE_DPAD_UP){    //当用户点击↑键时  
  89.              y–;    //设置Y轴坐标减1  
  90.          }  
  91.          return super.onKeyDown(keyCode, event);  
  92.      }  
  93.    
  94.      @Override  
  95.      public void run() {  
  96.          while (flag) {  
  97.              Draw(); // 调用自定义画画方法  
  98.              try {  
  99.                  Thread.sleep(50); // 让线程休息50毫秒  
  100.              } catch (InterruptedException e) {  
  101.                  e.printStackTrace();  
  102.              }  
  103.          }  
  104.      }  
  105.    
  106.  }  


MySurfaceView首先继承SurfaceView,然后实现Runnable和Callback接口

 

重写了Runnable的run方法和Callback的surfaceCreated(SurfaceHolder holder),surfaceChanged(SurfaceHolder holder, int format, int width,int height),surfaceDestroyed(SurfaceHolder holder)方法,

还实现了onTouchEvent(MotionEvent event),onKeyDown(int keyCode, KeyEvent event)方法来,详细的在代码里已注释。

更多信息请查看 java进阶网 http://www.javady.com

发表评论

电子邮件地址不会被公开。 必填项已用*标注