2013-09-03 2 views
0

У меня есть FrameLayout с четырьмя SurfaceView, расположенными в сетке 2x2. Пользователь может изменять размеры каждого из видов.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. Я также пытался сделать недействительным все. Я переопределил onDraw FrameLayout, надеясь заставить правильный порядок рисования. Нет.

Несколько пунктов: я использую FrameLayout, а не Grid, потому что мне хотелось бы, чтобы более крупные виды отображали более мелкие виды, вместо того, чтобы иметь более крупный вид, нажмите на меньший вид в сторону, как и поведение в GridView.

Чтобы правильно расположить вид ребенка, я корректирую их поля и устанавливаю их силу тяжести на «верх» (не имеет значения, какое значение я использую для силы тяжести, только до тех пор, пока гравитация установлена ​​на что-то, рентабельность). Может ли серьезность быть проблемой?

Кроме того, я уверен, что есть более эффективный способ изменить порядок просмотров, но всего четыре, поэтому все работает нормально.

+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 получает свое собственное, отдельное окно. Я подозреваю, что эти окна не переупорядочиваются, когда представления переупорядочиваются. То, что вы пытаетесь сделать, вероятно, будет работать на любой другой вид виджетов.

Смежные вопросы