SurfaceView概要介紹
SurfaceView在View層次內部提供了一個專用的繪圖界面,你可以控制這個界面的格式以及尺寸。
由於SurfaceView界面有Z軸順序,因此SurfaceView可能在持有它的窗口的背後,它要沖破隱藏它的窗口,才會允許它的界面顯示出來。View的層次管理會正確的處理界面的合成,通常,SurfaceView會顯示在相同層級的其他View的上面。這樣它就可以覆蓋在諸如按鈕等界面的上面,但是,要注意這樣會影響性能,因為每次界面變化時,都會執行完整的透明度合成處理。
由於讓SurfaceView界面可見的透明區域要依賴View層次中布局的位置,所以,如果後布局的,位於SurfaceView上面的同級別的View使用了透明屬性來繪制,那麼這個View就不會正確的跟界面合成。
通過SurfaceHolder接口提供的方法可以訪問位於界面之下的SurfaceView對象,這個接口對象可以通過調用SurfaceView對象的getHolder()方法來獲取。
當擁有SurfaceView的窗口可見時,界面會被創建,因此你應該實現SurfaceHolder.Callback接口中surfaceCreated(SurfaceHolder)和surfaceDestroyed(SurfaceHolder)方法,這樣就會在窗口顯示和隱藏時發現該界面的創建和銷毀時機。
這個類的主要目的之一就是提供一個可以用二級線程來進行屏幕渲染的界面。如果你要使用這個方法來繪圖,需要注意以下事情:
1. 所有的SurfaceView和SurfaceHolder.Callback方法,都會被運行該SurfaceView的窗口的線程所調用(通常指應用程序的主線程)。因此,需要正確的同步繪圖線程所觸發的任何狀態。
2. 必須確保繪圖線程只在該界面下的SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()方法被調用之間有效。
SurfaceView的使用方法:
1. 繼承SurfaceView類並實現SurfaceHolder.Callback接口;
2. 編寫自己的繪圖線程;
3. 在步驟1的SurfaceHolder.Callback接口的surfaceCreated()方法中啟動繪圖線程;
代碼示例:
package com.example.graphictest;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
publicclassMySurfaceView extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder holder;
private MyDrawingThread drawingThread;
public MySurfaceView(Contextcontext){
super(context);
holder = this.getHolder();
holder.addCallback(this);
drawingThread = new MyDrawingThread(holder);
}
@Override
publicvoidsurfaceChanged(SurfaceHolder holder, int format, int width, int height){
//
}
@Override
publicvoidsurfaceCreated(SurfaceHolder holder){
drawingThread.start();
}
@Override
publicvoidsurfaceDestroyed(SurfaceHolder holder){
}
classMyDrawingThread extends Thread{
private SurfaceHolder holder;
public MyDrawingThread(SurfaceHolderholder){
this.holder = holder;
}
@Override
publicvoid run(){
Canvas c = null;
try{
synchronized(holder){
c= holder.lockCanvas();
c.drawColor(Color.BLACK);
Paintp = newPaint();
p.setColor(Color.WHITE);
Rectr = newRect(100, 50, 300, 250);
c.drawRect(r,p);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(c != null){
holder.unlockCanvasAndPost(c);
}
}
}
}
}