2x2 グリッドに配置された 4 つの SurfaceView を持つ FrameLayout があります。ユーザーは、各ビューのサイズを変更できます。
ビューを領域の順に描画し、最大のビューを最初に描画したいと思います。ビューのサイズが変更されるたびに、ビューを領域別に並べ替え、FrameLayout を更新します。
public void reorderViews() {
PlotView child1;
PlotView child2;
boolean swap = false;
for(int i = 0; i < layout.getChildCount(); i++) {
child1 = (PlotView) layout.getChildAt(i);
for(int j = i + 1; j < layout.getChildCount(); j++) {
child2 = (PlotView) layout.getChildAt(j);
if(child1.area < child2.area) {
layout.removeViewAt(j);
layout.addView(child2, i);
}
}
}
}
これは、FrameLayout の子配列がビューを正しい順序で保持するという意味で機能します。しかし、並べ替えた後、ビューは引き続き元の順序 (つまり、最初に追加された順序) で描画されます。
FrameLayout の親ビューで、個々の子ビューで FrameLayout のレイアウトを要求しようとしました。また、すべてを無効にしようとしました。正しい描画順序を強制することを期待して、FrameLayout の onDraw をオーバーライドしました。立ち入り禁止。
いくつかのポイント: GridView の動作のように、大きなビューで小さなビューを押しのけるのではなく、大きなビューで小さなビューを覆い隠したいので、Grid ではなく FrameLayout を使用しています。
子ビューを適切に配置するために、余白を調整し、重力を「上」に設定します (重力が何かに設定されている限り、余白が機能する限り、重力に使用する値は問題ではないようです)。重力が問題なのだろうか?
また、ビューを並べ替えるより効率的な方法があると確信していますが、合計で 4 つしかないため、これは問題なく機能します。