0

我有一个 FrameLayout,其中四个 SurfaceViews 排列在 2x2 网格中。用户可以调整每个视图的大小。

我希望按照区域的顺序绘制视图,首先绘制最大的视图,依此类推。每次调整视图大小时,我都会按区域对视图进行排序,并更新 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,希望强制执行正确的绘制顺序。不去。

几点:我使用 FrameLayout 而不是 Grid,因为我希望更大的视图遮盖更小的视图,而不是让更大的视图将更小的视图推到一边,就像 GridView 中的行为一样。

为了正确定位子视图,我调整了它们的边距并将它们的重力设置为“顶部”(我为重力使用的值似乎并不重要,只要重力设置为某个值,边距就可以工作)。重力可能是问题吗?

此外,我确信有一种更有效的方式来重新排列视图,但总共只有四个,所以这可以正常工作。

4

1 回答 1

0

SurfaceView小部件不是使用正常的 Android 布局机制绘制的。相反,每个SurfaceView都有自己的独立窗口。我怀疑重新排序视图时没有重新排序这些窗口。您尝试做的可能适用于任何其他类型的小部件。

于 2014-09-27T04:32:33.890 回答