のAndroidソースコードを読んだ後、これがどのように行われるかView
をViewGroup
発見しました。システムが画面にビューを描画すると、画面全体のラスターである Canvas が生成されます。その Canvas は「切り取られ」てサブビューに与えられて描画されるのではなく、各ビューに対応するように変換およびクリップされます。
特定のビューが描画される前に、その親は Canvas を子の位置に移動し、Canvas を子のサイズにクリップしてから、.draw(Canvas)
そのビューを呼び出します。ビューはキャンバスが変更されたことを認識せず、各ビューはあたかも (0,0) にあるかのように描画します。子が描画を終了すると、Canvas は元の位置に戻されます。抽象的には、すべてのビューはそれが唯一のビューであると考えていますが、実際には各親がキャンバスを適切な場所に配置およびサイズ変更しています。
したがって、私の状況では、次のように各子オブジェクトを反復処理するだけで済みました。
for(MyObject mob : mobjects) {
final int restoreTo = canvas.save();
canvas.translate(mob.getX(), mob.getY());
canvas.clipRect(0, 0, mob.getWidth(), mob.getHeight());
mob.onDraw(canvas);
canvas.restoreToCount(restoreTo);
}