2009年6月10日 星期三

Android Canvas的save()跟restore()函式

在看有關SurfaceView等相關code的時候
有時會看到save()跟restore()兩個函式包起來的程式碼片段

..
canvas.save();
canvas.rotate((float) mHeading, (float) mX, mCanvasHeight
- (float) mY);

if (mMode == STATE_LOSE) {
mCrashedImage.setBounds(xLeft, yTop, xLeft + mLanderWidth, yTop
+ mLanderHeight);
mCrashedImage.draw(canvas);
} else if (mEngineFiring) {
mFiringImage.setBounds(xLeft, yTop, xLeft + mLanderWidth, yTop
+ mLanderHeight);
mFiringImage.draw(canvas);
} else {
mLanderImage.setBounds(xLeft, yTop, xLeft + mLanderWidth, yTop
+ mLanderHeight);
mLanderImage.draw(canvas);
}
canvas.restore();
..

如上面所示,因為某些繪圖上的效果必須透過canvas提供的函式達到
所以必須修改canvas的狀態,如上面紅字的部分canvas.rotate()
但是問題是其他繪圖物件也必須用到canvas,因此必須有個機制能夠回復canvas被改變的狀態
這可以夠過canvas提供的save跟restore兩個函式辦到
先用save保存canvas的狀態,之後再去做須要改變canvas的動作,最後用完了再用restore把canvas的狀態復原

舉個例子

canves.save();
canves.rotate(20.86f);
people.draw(canves);
canves.restore();
p.setColor(Color.BLUE);
canves.drawRect(new Rect(100,100,200,200), p);

我希望people可以轉個角度,所以改變了canvas的rotate,但是我之後必須畫一個正方形
但我不希望他跟著旋轉,所以就用save跟restore鎖定要改變角度的程式碼
這樣可以讓其他繪圖工作不受影響

結果如下


如果我不用save、restore的話,藍色正方形的部分會跟著人類圖像一起旋轉

沒有留言: