我有一个 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 中的行为一样。
为了正确定位子视图,我调整了它们的边距并将它们的重力设置为“顶部”(我为重力使用的值似乎并不重要,只要重力设置为某个值,边距就可以工作)。重力可能是问题吗?
此外,我确信有一种更有效的方式来重新排列视图,但总共只有四个,所以这可以正常工作。