Android:FrameLayout不尊重绘制顺序

时间:2013-09-03 21:45:18

标签: android draw android-framelayout z-order

我有一个FrameLayout,其中四个SurfaceView排列在一个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的children数组以正确的顺序保存视图。但在重新排序之后,视图继续以其原始顺序(即它们最初添加的顺序)绘制。

我已尝试在FrameLayout的父视图上的各个子视图上的FrameLayout上请求布局。我也试过让一切都搞砸了。我已经覆盖了FrameLayout的onDraw,希望强制使用正确的绘制顺序。不行。

有几点:我使用的是FrameLayout而不是Grid,因为我希望较大的视图可以遮挡较小的视图,而不是像较大的视图那样将较小的视图放在一边,就像GridView中的行为一样。

为了正确定位儿童视图,我调整他们的边距并将他们的重力设置为“顶部”(只要重力被设置为某种东西,边缘似乎不重要我用于引力的值工作)。重力可能是问题吗?

另外,我确信有一种更有效的方法来重新排序视图,但总共只有四种,所以这样可行。

1 个答案:

答案 0 :(得分:0)

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