android中SurfaceView組件使用解析

來源:互聯網
上載者:User

標籤:des   android   style   io   ar   color   os   使用   sp   

SurfaceView組件可以實現高效率的繪製二維圖或者顯示映像,在遊戲開發中經常用到。在android中,已經提供了SurfaceView組件。使用時,一般是通過繼承的方法實現自訂surfaceView,也可以在MainActivity中通過介面surfaceHolder.callback介面實現,這裡介紹通過介面實現surfaceView繪圖,當然,繪圖可以是靜態圖(在指定地區只繪製一次),也可以是動態圖(指定地區-->繪製-->再迴圈)。

SurfaceView組件的使用流程:通過findViewById()執行個體化SurfaceView組件,得到執行個體化對象;利用getHolder()方法得到SurfaceViewHolder類對象,為該對象添加callBack(Context context)回調;在surfaceCreate()方法中添加surfaceView剛顯示的初始化代碼,這個方法在執行個體化SurfaceView組件時執行,比如可以初始化背景顏色,繪圖區顯示出的形狀、座標等;surfaceChanged()方法主要是在surfaceView對象大小、形狀改變時調用;surfaceDestroyed()方法是在surfaceView銷毀時調用,一般是添加kill代碼。

在SurfaceView組件顯示地區上,實現繪製二維圖形需要三個類:Paint、Canvas和SurfaceHolder類。其中Paint類指的是畫筆,可以設定畫筆的顏色(類似於紅筆芯還是藍筆芯),畫筆顯示的線寬(類似於0.35mm還是0.5mm)等;Canvas類相當於畫布,它通過SurfaceHolder類中的lockCanvas()方法獲得,這個lockCanvas()方法可以帶有參數,用來指定鎖定畫布的地區(也就是說,畫布鎖定的地區不一定是surfaceView定義的全部地區,也可以是參數指定的部分地區),當鎖定了地區之後,就可以通過Canvas類執行個體對象所提供的方法來繪製點、線、圓、矩形、映像等,這些方法中的參數一般會有Paint類對象。

需要注意的一點是,在鎖定畫布地區進行繪製圖形或者映像的代碼,一般是開一個獨立線程進行的,這個線程可以在surfaceCreate()方法中開啟。

唉,圖片加不上去,只能貼代碼了。

package com.main.dfa_surfaceview; import android.support.v7.app.ActionBarActivity;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Bundle;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast; public class MainActivity extends ActionBarActivity implements SurfaceHolder.Callback {    Button btn1=null;    SurfaceView sfc=null;    SurfaceHolder holder=null;    Paint paint_one=null;    Paint paint_two=null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                 btn1=(Button)findViewById(R.id.btn1);        sfc=(SurfaceView)findViewById(R.id.surfaceView1);        holder=sfc.getHolder(); //得到surfaceView的holder,類似於surfaceView的控制器        holder.addCallback(this);                paint_one=new Paint(); //擷取畫筆執行個體        paint_two=new Paint();        paint_one.setColor(Color.BLUE); //畫筆顏色        paint_two.setColor(Color.GREEN);        paint_one.setStrokeWidth(20); //設定線寬        paint_two.setStrokeWidth(10);         btn1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {                // TODO Auto-generated method stub                Toast.makeText(MainActivity.this, "asdgdsgas", Toast.LENGTH_SHORT).show();                MyThread mthread=new MyThread();                mthread.start();            }        });           }    @Override    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {        // TODO Auto-generated method stub            }    @Override    public void surfaceCreated(SurfaceHolder arg0) {        // TODO Auto-generated method stub        //當surfaceView建立的時候執行        init_background();//初始化繪圖介面    }    @Override    public void surfaceDestroyed(SurfaceHolder arg0) {        // TODO Auto-generated method stub            }        private void init_background(){        Canvas canvas=null;        canvas=holder.lockCanvas();//擷取目標畫圖地區        canvas.drawColor(Color.RED);//畫布背景顏色           holder.unlockCanvasAndPost(canvas); //解除鎖定並顯示     }         private class MyThread extends Thread{                public void run(){            Canvas canvas=null;            canvas=holder.lockCanvas();//擷取目標畫圖地區,無參數表示鎖定的是全部繪圖區            canvas.drawColor(Color.RED);//畫布背景顏色設定            canvas.drawCircle(100, 100, 50, paint_one);//以(100,100)為圓心,畫一個半徑為50像素的圓            canvas.drawCircle(50, 50, 50, paint_two);            holder.unlockCanvasAndPost(canvas); //解除鎖定並顯示         }       }}



android中SurfaceView組件使用解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.