【AndroidのCanvasに向き合おう】 描画範囲を制御する
クリッピングのオプションを指定する
クリッピングするclip系のメソッドは引数にRegion.Opを持つオーバーロードが存在します。
オプションを使用することで描画範囲を複雑に指定することができます。
Region.Opについて
オプションは6種類存在します、これらのオプションは今の描画範囲とメソッドで指定された範囲の二つの範囲を元に描画範囲を決定します。
Region.Op UNION | 元の描画範囲と指定された範囲の両方が描画範囲となります。 |
Region.Op REPLACE | 元の描画範囲を指定された範囲に置き換えます。 |
Region.Op DIFFERENCE | 元の描画範囲に対して指定された範囲を削除します。 |
Region.Op REVERSE_DIFFERENCE | 指定された範囲に対して、元の描画範囲を削除した部分が描画範囲になります。 |
Region.Op INTERSECT | 元の描画範囲と指定された範囲の重なる部分が描画範囲となります。 |
Region.Op XOR | 2つの範囲の論理演算XORをとります。 |
クリッピングのオプションを指定して描画範囲を制御する | ||
boolean | clipRect(float left, float top, float right, float bottom, Region.Op op) | 四角形の左上と右下の座標を指定してオプションに従いクリッピングする。 座標は対象のオリジナルCanvasの左上を原点とします。 ただし、クリップは現在のクリップされた範囲内で行われる。
|
boolean | clipRect(Rect rect, Region.Op op) | Rectを使用してオプションに従いクリッピングする。 座標は対象のオリジナルCanvasの左上を原点とします。 ただし、クリップは現在のクリップされた範囲内で行われる。
|
boolean | clipRect(RectF rect, Region.Op op) | RectFを使用してオプションに従いクリッピングする。 座標は対象のオリジナルCanvasの左上を原点とします。 ただし、クリップは現在のクリップされた範囲内で行われる。
|
boolean | clipPath(Path path, Region.Op op) | Pathを使用してオプションに従いクリッピングする。 座標は対象のオリジナルCanvasの左上を原点とします。 ただし、クリップは現在のクリップされた範囲内で行われる。
|
boolean | clipRegion(Region region, Region.Op op) | Regionを使用してオプションに従いクリッピングする。 座標は対象のオリジナルCanvasの左上を原点とします。 ただし、クリップは現在のクリップされた範囲内で行われる。 API level 21で非推奨になりました。 clipRect(Rect)を代わりに使用しましょう。
|
final Rect | getClipBounds() | 現在クリッピングされている範囲をRectインスタンスとして取得する。 |
boolean | getClipBounds(Rect bounds) | 空のRectインスタンスに現在クリッピングされている範囲を設定する。 |
public class MyCanvasClip extends View{ public MyCanvasClip(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { //幅の1単位を200にする int widthUnit = 200; //高さの1単位を200にする int heightUnit = 200; /** * canvasの描画範囲を下記の矩形に制限する。 * 左上座標 [x:0,y:0] * 右下座標 [x:400,y:400] */ Rect rect = new Rect(0,0,widthUnit*2,heightUnit*2); canvas.clipRect(rect); /** * canvasの描画範囲から下記の範囲を削除する。 * 左上座標 [x:200,y:200] * 右下座標 [x:400,y:400] * Region.Op DIFFERENCE * 元の描画範囲に対して指定された範囲を削除します。 */ rect = new Rect(widthUnit,heightUnit,widthUnit*2,heightUnit*2); canvas.clipRect(rect, Region.Op.DIFFERENCE); /** * クリッピングされた範囲を黒色に塗りつぶす。 */ canvas.drawColor(Color.BLACK); /** * canvasの描画範囲から下記の範囲に完全に置き換える。 * 左上座標 [x:0,y:400] * 右下座標 [x:400,y:800] * Region.Op REPLACE * 元の描画範囲を指定された範囲に置き換えます。 */ rect = new Rect(0,heightUnit*2,widthUnit*2,heightUnit*4); canvas.clipRect(rect, Region.Op.REPLACE); /** * クリッピングされた範囲を青色に塗りつぶす。 */ canvas.drawColor(Color.BLUE); /** * canvasの描画範囲から下記の範囲に完全に置き換える。 * 左上座標 [x:0,y:800] * 右下座標 [x:400,y:1200] * Region.Op REPLACE * 元の描画範囲を指定された範囲に置き換えます。 */ rect = new Rect(0,heightUnit*4,widthUnit*2,heightUnit*6); canvas.clipRect(rect, Region.Op.REPLACE); /** * canvasの描画範囲を下記の範囲との共通部分に変更する。 * 左上座標 [x:200,y:1000] * 右下座標 [x:400,y:1200] * Region.Op INTERSECT * 元の描画範囲と指定された範囲の重なる部分が描画範囲となります。 */ rect = new Rect(widthUnit,heightUnit*5,widthUnit*2,heightUnit*6); canvas.clipRect(rect, Region.Op.INTERSECT); /** * クリッピングされた範囲を緑色に塗りつぶす。 */ canvas.drawColor(Color.GREEN); /** * canvasの描画範囲から下記の範囲に完全に置き換える。 * 左上座標 [x:0,y:1200] * 右下座標 [x:400,y:1600] * Region.Op REPLACE * 元の描画範囲を指定された範囲に置き換えます。 */ rect = new Rect(0,heightUnit*6,widthUnit*2,heightUnit*8); canvas.clipRect(rect, Region.Op.REPLACE); /** * canvasの描画範囲から下記の範囲に完全に置き換える。 * 左上座標 [x:0,y:1200] * 右下座標 [x:400,y:1600] * Region.Op XOR * 2つの範囲の論理演算XORをとります。 */ rect = new Rect(widthUnit,heightUnit*7,widthUnit*2,heightUnit*8); canvas.clipRect(rect, Region.Op.XOR); /** * クリッピングされた範囲を緑色に塗りつぶす。 */ canvas.drawColor(Color.YELLOW); rect = new Rect(widthUnit*2,0,widthUnit*4,heightUnit*2); canvas.clipRect(rect, Region.Op.REPLACE); rect = new Rect(widthUnit*4,0,widthUnit*6,heightUnit*2); /** * Region.Op UNION * 元の描画範囲と指定された範囲の両方が描画範囲となります。 */ canvas.clipRect(rect, Region.Op.UNION); /** * クリッピングされた範囲を緑色に塗りつぶす。 */ canvas.drawColor(Color.CYAN); /** * canvasの描画範囲から下記の範囲に完全に置き換える。 * 左上座標 [x:400,y:400] * 右下座標 [x:800,y:800] * Region.Op REPLACE * 元の描画範囲を指定された範囲に置き換えます。 */ rect = new Rect(widthUnit*2,heightUnit*2,widthUnit*4,heightUnit*4); canvas.clipRect(rect, Region.Op.REPLACE); /** * 下記の描画範囲からcanvasの範囲を削除する。 * 左上座標 [x:600,y:400] * 右下座標 [x:1000,y:800] * Region.Op REVERSE_DIFFERENCE * 指定された範囲に対して、元の描画範囲を削除した部分が描画範囲になります。 */ rect = new Rect(widthUnit*3,heightUnit*2,widthUnit*5,heightUnit*4); canvas.clipRect(rect, Region.Op.REVERSE_DIFFERENCE); /** * クリッピングされた範囲を暗灰色に塗りつぶす。 */ canvas.drawColor(Color.DKGRAY); /** * 現在クリッピングされている範囲を取得する。 */ Rect clippedRect = canvas.getClipBounds(); Toast.makeText(getContext(), clippedRect.toString(), Toast.LENGTH_LONG).show(); /** * 空のRectインスタンスに現在クリッピングされている範囲を設定する。 */ Rect bounds = new Rect(); canvas.getClipBounds(bounds); Toast.makeText(getContext(), bounds.toString(), Toast.LENGTH_LONG).show(); } }
|
|
|
|
|
||||||||||
| ||||||||||||||