我有两个ImageView
我需要什么:
将第二个ImageView
拖到另一个ImageView
,当它们相交时,我需要调用一个方法。
编辑1:
相交b / w两个imageView为DONE
,但在拖放时它没有发生。
编辑2:
如何在Drag and drop
上实现此功能?
答案 0 :(得分:10)
我认为您需要Android的此功能。 最简单的方法是使用Rect类中的intersects方法。 Link to documentation.
import android.graphics.Rect;
...
Rect rc1 = new Rect();
imageView1.getDrawingRect(rc1);
Rect rc2 = new Rect();
imageView2.getDrawingRect(rc2);
if (Rect.intersects(rc1, rc2)) {
// intersection is detected
// here is your method call
}
*编辑添加了缺少右括号
答案 1 :(得分:5)
这是我的解决方案
private boolean isViewOverlapping(View firstView, View secondView) {
final int[] location = new int[2];
firstView.getLocationInWindow(location);
Rect rect1 = new Rect(location[0], location[1],location[0] + firstView.getWidth(), location[1] + firstView.getHeight());
secondView.getLocationInWindow(location);
Rect rect2 = new Rect(location[0], location[1],location[0] + secondView.getWidth(), location[1] + secondView.getHeight());
return rect1.intersect(rect2);
// return (rect1.contains(rect2)) || (rect2.contains(rect1));
}
在
中调用上述功能@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DROP:
if(isViewOverlapping(view,child))
{Toast.makeText(this,"Overlapping with "+child.getTag() or text ,Toast.LENGTH_SHORT).show();
}
希望这有帮助
答案 2 :(得分:2)
@override
onWindowFocusChanged(boolean focus)
并将您的代码放在cz onCreate()/ onStart()中 - 这将无法正常工作
答案 3 :(得分:1)
您是否已经为第二个ImageView
创建了拖放功能?
如果是这样,您需要做的就是调用getLeft(), getRight(), so on以在拖动后找到第二个视图的位置(或者在拖动时每隔几个增量处理一个Handler),然后这将成为一个简单的矩形交叉点问题,already has an answer here。
答案 4 :(得分:0)
延迟回复,但我也遇到了这个问题并使用以下代码修复了它。 Action drop的解决方案在这里得到解答,所以我不再发布了。但如果您想要检测拖拽,则必须在DragEvent.ACTION_DRAG_LOCATION
内执行此操作。
获取当前拖动事件的x y:
int x_cord = (int) event.getX();
int y_cord = (int) event.getY();
现在计算矩形的大小。为此(在我的情况下),如果必须划分视图的大小,因为拖动位置在它的中心,然后计算顶部/左/右/底部:
int left = (int) (x_cord - halfViewSize);
int top = (int) (y_cord - halfViewSize);
int right = (int) (x_cord + halfVaieSize);
int bottom = (int) (y_cord + halfViewSize);
我输入了值,因为在我的情况下,halfViewSize是float
。如果您有integer
,则无需投射。
现在您可以使用以下值构建一个rect:
Rect rect = new Rect(left, top, right, bottom);
创建一个方法,检查rect是否与childViews的矩形相交:
private boolean collideWithOthers(Rect rect) {
int count = yourParentLayout.getChildCount();
boolean intersects = false;
for (int i = 0; i < count; i++) {
ImageView squareInside = (ImageView) yourParentLayout.getChildAt(i);
Rect rectInside = squareInside.getCollisionRect();
if (rectInside.intersect(rect)) {
Log.d("TAG", "ATTENTION INTERSECT!!!");
intersects = true;
break;//stop the loop because an intersection is detected
}
}
return intersects;
}
现在你可以在ACTION_DRAG_LOCATION
内完成这些工作:
int x_cord = (int) event.getX();
int y_cord = (int) event.getY();
int left = (int) (x_cord - halfViewSize);
int top = (int) (y_cord - halfViewSize);
int right = (int) (x_cord + halfVaieSize);
int bottom = (int) (y_cord + halfViewSize);
Rect rect = new Rect(left, top, right, bottom);
boolean collide = collideWithOthers(rect);
我希望这符合您的需求,如果没有,也许对其他人有帮助。