2011年2月14日 星期一

[Android] SurfaceView使用

SurfaceView和 view、ImageView比較起來,SurfaceView因為能使用thread重繪畫面
所以fps會高很多,但是,它是很實用的。

範例:

public class ViewTest extends SurfaceView implements SurfaceHolder.Callback
{
SurfaceHolder myholder;
Bigmap context;
Paint paint;
int colorNumber;
TestThread thread;
public ViewTest(Bigmap context)
{
super(context);
this.context = context;
myholder = this.getHolder();
myholder.addCallback(this);
paint = new Paint();
}

public void Draw()
{
Canvas canvas = myholder.lockCanvas();
if(colorNumber==0)
{
paint.setColor(Color.WHITE);
colorNumber += 1;
}
else if(colorNumber ==1)
{
paint.setColor(Color.RED);
colorNumber +=1;
}
else if(colorNumber ==2)
{
paint.setColor(Color.BLUE);
colorNumber=0;
}
canvas.drawCircle(100, 100,30, paint);
myholder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height)
{}

@Override
public void surfaceCreated(SurfaceHolder holder)
{
thread = new TestThread(this);
thread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder)
{}

}



public class TestThread extends Thread
{
ViewTest vt;
boolean loop = true;
public TestThread(ViewTest view)
{
vt = view;
}
public void run()
{
while(loop)
{
try{this.sleep(20);}
catch (InterruptedException e) {}

synchronized(vt.getHolder())
{
vt.Draw();
}
}
}
}
這兩段code只是讓 thread 去更新surfaceview 的畫面,而在surfaceview裡面,先定義好畫圓和顏色,這樣就能做到畫面更新效果。

在第一段程式碼裡,先繼承SurfaceView 實作SurfaceHolder.Callback
實作SurfaceHolder.Callback會有 三個method ,
surfaceChanged surfaceCreated surfaceDestroyed ,需要注意的是 surfaceCreated 是在此surfaceview 取得螢幕焦點的時候被執行的。

然後 在contructor裡,先取得 holder 物件, 再 寫一個 Draw method 用來讓thread 呼叫, 做繪圖用,當然名字 不一定要叫 Draw,隨便取都可以 = ="。

接著 再 Draw 裡面,需要一個canvas 變數 來承接myholder.lockCanvas() ,所回傳的canvas物件,這時畫面 會先暫時被鎖定 , 接下來的動作只是在畫面上畫一個圓圈,然後上色。
myholder.unlockCanvasAndPost(canvas) 這行 是讓 畫面解除 鎖定,執行canvas 動作。

然後再thread 裡面,要做到 畫面更新,只需要寫上 while 迴圈 持續 呼叫 Draw method 即可,
但是記得 要下 sleep ,不然程式 會因 更新過快,顯是不出來。

沒有留言:

張貼留言