2013-09-03 3 views
0

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 개이므로 확인이 완료됩니다.

+0

귀하의 알고리즘이 처음부터 올바르지 않다고 생각합니다. 'child1 = (PlotView) layout.getChildAt (i);'를 안쪽 루프로 옮겨야합니다. –

+0

http://developer.android.com/reference/android/view/View.html#bringToFront%28%29가 작동하는지 확인해 보셨습니까? – Nicholas

+0

bringToFront()를 시도했습니다. 그래도 나는 이미 수행하고있는 자식 뷰의 인덱스를 변경합니다. 내 문제는 레이아웃 프로세스와 관련이 있다고 확신하지만, 나는 무엇을 모르고있다. – user2744490

답변

0

SurfaceView 위젯은 일반적인 Android 레이아웃 메커니즘을 사용하여 그려지지 않습니다. 대신 각 SurfaceView은 자체의 별도 창을 가져옵니다. 보기가 재정렬 될 때 해당 창이 재 배열되지 않는다고 생각합니다. 당신이하려고하는 것은 아마 다른 종류의 위젯에서 작동 할 것입니다.

관련 문제