我有一堆带有纯色背景的视图。这些观点可以被拖走;我想根据视图是否与另一个视图相交来更改背景。以下是我在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
将触摸带到“前面”,因此如果用户隐藏在另一个视图后面,则可以轻松操作它。下面介绍它目前的工作原理:
这些视图使用RelativeLayout
进行布局。我开始认为视图的排序可能是导致这种情况的原因,但我不确定。
答案 0 :(得分: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);
}
}
}
我希望这会有所帮助。