我有一个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中的行为一样。
为了正确定位儿童视图,我调整他们的边距并将他们的重力设置为“顶部”(只要重力被设置为某种东西,边缘似乎不重要我用于引力的值工作)。重力可能是问题吗?
另外,我确信有一种更有效的方法来重新排序视图,但总共只有四种,所以这样可行。
答案 0 :(得分:0)
SurfaceView
小部件不是使用普通的Android布局机制绘制的。相反,每个SurfaceView
都有自己独立的窗口。我怀疑在重新排序视图时,这些窗口没有被重新排序。您尝试做的事情可能适用于任何其他类型的小部件。