Android的SurfaceView使用

來源:互聯網
上載者:User

  Android的大多數控制項都是繼承自View的,因此在自訂控制項時一般也是繼承View類,但是對於高效的,遊戲層級的繪圖,或者是播放器等要求比較高的地方,普通的View類就有點吃不開了,這個時候就要用到SurfaceView類。因為比較進階,所以就該裝B,單純一個繼承自SurfaceView類是不行的,必須實現一個SurfaceHolder.Callback介面來指明SurfaceView建立、改變、刪除時的回調方法,並且在SurfaceView中通過一個SurfaceHolder對象來控制SurfaceView。

  如果將該SurfaceView作為某個Activity的全屏View,則直接調用setContentView(new MyView());就好了;但若是作為螢幕View的一部份,就應該修改對應的layout XML檔案了,添加類似的布局代碼:

    <com.android.sv.MyView
    android:id="@+id/sv"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />
  其中com.example.fq.MyView為對應自訂類的全名。
  由於預設的XML檔案解析方法是調用View的View(Context , AttributeSet )建構函式構造View,因此你的自訂SurfaceView中也應該有一個參數為(Context , AttributeSet )的建構函式,並且在建構函式中執行父類的對應函數super( Context , AttributeSet )。在繪圖時,必須首先用Canvas c=holder.lockCanvas();鎖定並獲得畫布,隨後進行繪製,再調用holder.unlockCanvasAndPost(c);將繪製內容進行呈現

下面是個例子運行圖:

 

主介面:

 


  1. public class MainActivity extends Activity {  
  2.       
  3.     private MyView mSV=null;  
  4.     private Button mBtnOk;  
  5.     private Button mBtnCancle;  
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.main);  
  10.         mSV=(MyView)findViewById(R.id.sv);  
  11.         mSV.setTag(true);  
  12.         mBtnOk=(Button)findViewById(R.id.btnok);  
  13.         mBtnOk.setOnClickListener(new OnClickListener() {  
  14.               
  15.             public void onClick(View arg0) {  
  16.                 // TODO Auto-generated method stub  
  17.                 mSV.setTag(true);  
  18.             }  
  19.         });  
  20.           
  21.         mBtnCancle=(Button)findViewById(R.id.btnCancel);  
  22.         mBtnCancle.setOnClickListener(new OnClickListener() {  
  23.               
  24.             public void onClick(View arg0) {  
  25.                 // TODO Auto-generated method stub  
  26.                 mSV.setTag(false);  
  27.             }  
  28.         });  
  29.     }  
  30. }  


MyTest介面:

 

[java] view plaincopy

  1. public class MyView extends SurfaceView implements SurfaceHolder.Callback{  
  2.     private SurfaceHolder holder=null; //控制對象  
  3.     private Vector<Float> xs=new Vector<Float>();  
  4.     private Vector<Float> ys=new Vector<Float>();  
  5.     public MyView(Context context, AttributeSet attrs) {  
  6.         super(context, attrs);  
  7.         holder=getHolder();  
  8.         holder.addCallback(this);  
  9.     }  
  10.   
  11.     public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {  
  12.         // TODO Auto-generated method stub  
  13.           
  14.     }  
  15.   
  16.     public void surfaceCreated(SurfaceHolder arg0) {  
  17.         // TODO Auto-generated method stub  
  18.         new Thread(new MyLoop()).start();//在 View 中系統不允許主線程外的線程式控制制 UI .但是 SurfaceView 卻可以  
  19.     }  
  20.   
  21.     public void surfaceDestroyed(SurfaceHolder arg0) {  
  22.         // TODO Auto-generated method stub  
  23.           
  24.     }  
  25.     public void doDraw(Canvas canvas) {  
  26.            // TODO Auto-generated method stub  
  27.            super.onDraw(canvas);  
  28.            canvas.drawColor(Color.WHITE);//這裡是繪製背景  
  29.            Paint p=new Paint(); //筆觸  
  30.            p.setAntiAlias(true); //反鋸齒  
  31.            p.setColor(Color.BLACK);  
  32.            p.setStyle(Style.STROKE);  
  33.            int a=xs.size();  
  34.            for(int i=0;i<xs.size();i++)  
  35.             canvas.drawCircle(xs.elementAt(i),ys.elementAt(i),10, p);  
  36.         }  
  37.       
  38.     @Override  
  39.     public boolean onTouchEvent(MotionEvent event) {  
  40.        // TODO Auto-generated method stub  
  41.        if(event.getAction()==MotionEvent.ACTION_DOWN){  
  42.            String a=this.getTag().toString();  
  43.             if(a.equals("true")){  
  44.                  xs.add(event.getX());  
  45.                  ys.add(event.getY());  
  46.             }  
  47.        }  
  48.        return true;  
  49.     }  
  50.       
  51.     class MyLoop implements Runnable{  
  52.         //熟悉遊戲編程的應該很面熟吧,主迴圈  
  53.            public void run() {  
  54.             // TODO Auto-generated method stub  
  55.             while(true){  
  56.              try{  
  57.               Canvas c=holder.lockCanvas();  
  58.               doDraw(c);  
  59.               holder.unlockCanvasAndPost(c);  
  60.               Thread.sleep(20);  
  61.              }catch(Exception e){  
  62.                
  63.              }  
  64.             }  
  65.            }  
  66.             
  67.         }  
  68. }  


main.xml檔案:

 

[java] view plaincopy

    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="fill_parent"  
    5.     >  
    6.     <com.android.sv.MyView  
    7.     android:id="@+id/sv"  
    8.     android:layout_width="fill_parent"  
    9.     android:layout_height="fill_parent"  
    10.     />  
    11.     <Button android:id="@+id/btnok"  
    12.             android:layout_width="wrap_content"  
    13.             android:layout_height="wrap_content"  
    14.             android:text="開啟繪圖"/>  
    15.     <Button android:id="@+id/btnCancel"  
    16.             android:layout_width="wrap_content"  
    17.             android:layout_height="wrap_content"  
    18.             android:layout_toRightOf="@id/btnok"  
    19.             android:text="取消繪圖"/>    
    20. </RelativeLayout>  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.