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.example.fq.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);將繪製內容進行呈現

下面是個例子:
MyView.java:
public class MyView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder=null; //控制對象
private Vector<Float> xs=new Vector<Float>();
private Vector<Float> ys=new Vector<Float>();

public MyView(Context context,AttributeSet attr) {
   super(context,attr);
   // TODO Auto-generated constructor stub
   holder=getHolder();
   holder.addCallback(this);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
   // TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   new Thread(new MyLoop()).start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
   // TODO Auto-generated method stub

}

public void doDraw(Canvas canvas) {
   // TODO Auto-generated method stub
   super.onDraw(canvas);
   canvas.drawColor(Color.WHITE);//這裡是繪製背景
   Paint p=new Paint(); //筆觸
   p.setAntiAlias(true); //反鋸齒
   p.setColor(Color.BLACK);
   p.setStyle(Style.STROKE);
   for(int i=0;i<xs.size();i++)
    canvas.drawCircle(xs.elementAt(i),ys.elementAt(i),10, p);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
   // TODO Auto-generated method stub
   if(event.getAction()==MotionEvent.ACTION_DOWN){
    xs.add(event.getX());
    ys.add(event.getY());
   }
   return true;
}

class MyLoop implements Runnable{
//熟悉遊戲編程的應該很面熟吧,主迴圈
   @Override
   public void run() {
    // TODO Auto-generated method stub
    while(true){
     try{
      Canvas c=holder.lockCanvas();
      doDraw(c);
      holder.unlockCanvasAndPost(c);
      Thread.sleep(20);
     }catch(Exception e){
    
     }
    }
   }
 
}

}

Main.java
public class Main extends Activity {
private MyView sv=null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        sv=(CalendarView)findViewById(R.id.sv);
    }
}

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <com.example.fq.MyView
    android:id="@+id/sv"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />
</LinearLayout>


相關文章

聯繫我們

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