Android canvasの使い方紹介のsave()とrestore()

2041 ワード

一.まずcanvasのsaveとrestore機能についてお話しします.これはcanvasの魅力的な部分です.
onDrawメソッドには、コントロールのビジュアルインタフェースを描くキャンバスであるCanvasオブジェクトが表示されます.
onDrawメソッドでは、saveメソッドとrestoreメソッドを呼び出すのがよく見られますが、それらはいったい何のために使われているのでしょうか.
❑save:Canvasの状態を保存します.saveの後、Canvasの平行移動、縮小、回転、誤切断、切り取りなどの操作を呼び出すことができます.
❑restore:Canvas以前に保存した状態を復元するために使用します.save後にCanvasで実行される操作が後続の描画に影響を与えることを防止します.
saveとrestoreはペアで使用されます(restoreはsaveより少ないが、多くはできません).restore呼び出し回数がsaveより多い場合、Errorが発生します.saveとrestoreの間には、Canvasに対する特殊な操作が混ざっていることが多い.
たとえば、キャンバスに右向きの三角矢印を描きたいと思っています.もちろん、直接描くことができます.また、キャンバスを90°回転させ、上向きの矢印を描いてから、回転することもできます(この回転操作は、円周上のマークを描くのにあまり役立ちません).次に、右下に20ピクセルの円があるとします.では、onDrawのコアコードは次のとおりです.
1
2
3
4
5
6
7
8
9
10
11 int px = getMeasuredWidth();     int py = getMeasuredWidth();     // Draw background     canvas.drawRect(0, 0, px, py, backgroundPaint);     canvas.save();     canvas.rotate(90, px/2, py/2);
ここで、rotateの後ろにはgetMeasuredWidth()とgetMeasuredHeight()が必要です.具体的にはどうして私もよく分かりません..
1
2
3
4
5
6
7
8
9
10
11
12
13 // Draw up arrow     canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);     canvas.drawLine(px / 2, 0, px, py / 2, linePaint);     canvas.drawLine(px / 2, 0, px / 2, py, linePaint);     canvas.restore();     // Draw circle     canvas.drawCircle(px - 10, py - 10, 10, linePaint);
効果は図1に示します.
図1
saveとrestoreを呼び出さないとどうなりますか?図2に示すように、
図2
この2つの図から、円の位置の明らかな違いが見えます.Canvasのsaveとrestore操作を行わないと、すべての画像がキャンバスを90°回転させたキャンバスに描かれます.onDrawメソッドを実行すると、キャンバスが自動的に復元されます.saveとrestore操作が実行されるタイミングが異なると、描画される図形が異なります.
したがって、saveとrestoreの間には、Canvasに対する特殊な操作が混ざっていることが多い.