0

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 つしかないため、これは問題なく機能します。

4

1 に答える 1