2015-02-10 4 views
0

У меня есть куча просмотров с цельноцветными фонами. Эти взгляды можно перетаскивать; Я хотел бы изменить фон в зависимости от того, пересекается или нет вид с другим видом. Ниже приведен код, я использую в MotionEvent.ACTION_UPСтранная проблема с меняющимся цветом фона обзора

// Get all children of the parent view 
for(int i = 0; i < ((ViewGroup) getParent()).getChildCount(); i++) { 
    View childOne = ((ViewGroup) getParent()).getChildAt(i); 
    // For each child, check for intersection with siblings 
    for(int z = 0; z < ((ViewGroup) getParent()).getChildCount(); z++) { 
     View childTwo = ((ViewGroup) getParent()).getChildAt(z); 
     if(childOne == childTwo) 
      continue; 
     Rect recOne = new Rect(); 
     childOne.getHitRect(recOne); 
     Rect recTwo = new Rect(); 
     childTwo.getHitRect(recTwo); 
     if (Rect.intersects(recOne, recTwo)) { 
      ((EditView) childTwo).setPaintColor(Color.RED); 
     } else { 
      ((EditView) childTwo).setPaintColor(Color.GREEN); 
     } 
    } 
} 

Это должно петли через каждый вид и проверить, если вид пересекается с другой точкой зрения. Если это так, измените цвет фона пересекающегося вида. Все виды расширяют класс EditView, который обрабатывает свои собственные события касания. Я должен также упомянуть, что MotionEvent.ACTION_DOWN приносит касание к «фронту», поэтому пользователь может легко манипулировать им, если он скрыт за другим видом. Ниже объясняется, как в настоящее время он работает:

example

Эти взгляды изложены с использованием RelativeLayout. Я начинаю думать, что причиной этого может быть упорядочение взглядов, но я не уверен.

ответ

1

На мой взгляд, вам нужно немного изменить свою петлю for. Причина в том, что если childOne пересекается с childTwo, это означает, что childTwo также пересекается с childOne (так что нет необходимости дважды проверять). И поскольку оба представления пересекаются, я бы изменил цвета обоих представлений одновременно. Поэтому я бы изменил ваш код таким образом:

// Get all children of the parent view 
for(int i = 0; i < ((ViewGroup) getParent()).getChildCount(); i++) { 
    View childOne = ((ViewGroup) getParent()).getChildAt(i); 
    // For each child, check for intersection with siblings 
    // start z at index (i+1) 
    for(int z = i+1; z < ((ViewGroup) getParent()).getChildCount(); z++) { 
     View childTwo = ((ViewGroup) getParent()).getChildAt(z); 
     Rect recOne = new Rect(); 
     childOne.getHitRect(recOne); 
     Rect recTwo = new Rect(); 
     childTwo.getHitRect(recTwo); 
     if (Rect.intersects(recOne, recTwo)) { 
      // both views intersect, change both to red 
      ((EditView) childOne).setPaintColor(Color.RED); 
      ((EditView) childTwo).setPaintColor(Color.RED); 
     } else { 
      // both views do not intersect, change both to green 
      ((EditView) childOne).setPaintColor(Color.GREEN); 
      ((EditView) childTwo).setPaintColor(Color.GREEN); 
     } 
    } 
} 

Надеюсь, это поможет.

+0

Спасибо за подсказку! Думаю, я тоже выяснил этот вопрос. При переходе через представления, если представление не пересекается с представлением, оно будет изменено на зеленый, независимо от того, пересекается ли оно с другим видом или нет. Мне нужно найти способ обойти это. – Raggeth

+0

@ Raggeth Я действительно не рассматривал случай, который вы только что упоминали. – iRuth