2011-02-16 3 views
2

Я пытаюсь создать игру в формате jumble, в которой вы перетаскиваете письмо вправо или влево в перемешанном слове, а буквы меняются. Каков наилучший способ переупорядочить элементы в RelativeLayout программно, поэтому, когда письмо перетаскивается, буквы, которые проходит мимо плитки, расположены справа от перетаскиваемой буквы.Программно упорядочивающий RelativeLayout

Я пробовал что-то подобное в качестве основного теста.

public static void moveTile(Tile tile, int x, RelativeLayout parent) { 
    if (x < tile.getWidth()) { 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     params.addRule(RelativeLayout.LEFT_OF, tile.getId() - 1); 
     tile.setLayoutParams(params); 

     RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     p.addRule(RelativeLayout.RIGHT_OF, tile.getId()); 
     Tile t = (Tile) parent.findViewById(tile.getId() - 1); 
     t.setLayoutParams(p); 
    } 
    parent.invalidate(); 
} 

Но это вызывает приложение к сбою с ошибкой о «Круговые зависимостями не может существовать в RelativeLayout», который я понимаю, но я просто не уверен, что другой способ сделать это.

Любая помощь будет очень признательна.

ответ

0

Я закончил с использованием LinearLayout и просто удалил плитку до или после и заменил ее выбранной в данный момент плитки чем-то вроде этого.

public static void moveTile(Tile tile, int x, LinearLayout parent) { 
    if (x < 0) { 

     int t = Math.abs(x)/tile.getWidth() + 1; 

     if (tile.getId() - t >= 0) { 
      Tile new_tile = (Tile) parent.findViewById(tile.getId() - t); 

      parent.removeViewAt(new_tile.getId()); 
      parent.addView(new_tile, tile.getId()); 

      int id = tile.getId(); 
      tile.setId(new_tile.getId()); 
      new_tile.setId(id); 
     } 
    } else if (x > tile.getWidth()) { 

     int t = x/tile.getWidth(); 

     if (tile.getId() + t < word.length()) { 
      Tile new_tile = (Tile) parent.findViewById(tile.getId() + t); 

      parent.removeViewAt(new_tile.getId()); 
      parent.addView(new_tile, tile.getId()); 

      int id = tile.getId(); 
      tile.setId(new_tile.getId()); 
      new_tile.setId(id); 
     } 
    } 
} 
2

Да, эта ошибка означает, что вы не должны иметь object1 быть toRightOf Объект2 и object2 toLeftOf объекта 1

+0

Да, я это понимаю. Любые предложения о том, как выполнить позиционирование букв при движении справа налево? –

+1

Удалил бы оба правила, прежде чем добавлять новые, так что никогда не бывает, когда что-то круговое? – Dre

0

Я думаю, в вашем случае вы не должны использовать toRightOf и toLeftOf позиционировать свои взгляды, но попытаться использовать только запас слева и крайнее значение для всех из них. Таким образом, ваши взгляды ребенка будут независимо друг от друга, и вы можете перемещать их, изменяя их поля.

+0

Да, но поля используют некоторую конкретную ценность, и это будет выглядеть не то же самое на разных разрешениях, потому что размер букв будет явно отличаться и перекрывать друг друга. – Lonkly

+0

Поля могут быть установлены в dp. Поэтому, если все установлено в dp, оно должно сохранить порядок. Однако, если вам нужно больше контролируемых позиций, лучше всего рисовать все на холсте в пользовательском представлении, не согласны ли вы? – Lumis

+0

У меня возникли проблемы с его решением, используя поля. Кажется, что поля основаны на родительском представлении, поэтому устанавливаем статический запас для всех букв, обрабатывающих буквы по-разному. Поэтому я не думаю, что это сработает. –

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