4 개의 SurfaceView가 2x2 격자로 배열 된 FrameLayout이 있습니다. 사용자는 각보기의 크기를 조정할 수 있습니다.Android : 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 개이므로 확인이 완료됩니다.
귀하의 알고리즘이 처음부터 올바르지 않다고 생각합니다. 'child1 = (PlotView) layout.getChildAt (i);'를 안쪽 루프로 옮겨야합니다. –
http://developer.android.com/reference/android/view/View.html#bringToFront%28%29가 작동하는지 확인해 보셨습니까? – Nicholas
bringToFront()를 시도했습니다. 그래도 나는 이미 수행하고있는 자식 뷰의 인덱스를 변경합니다. 내 문제는 레이아웃 프로세스와 관련이 있다고 확신하지만, 나는 무엇을 모르고있다. – user2744490