6

我有两个ImageView

  1. 一个固定在一个位置
  2. 第二,我需要应用拖放功能。

我需要的:

将第二个拖到ImageView另一个ImageView,当它们相交时,我需要调用一个方法。

编辑1:

相交 b/w 两个 imageViewDONE但在拖放时它没有发生。

编辑 2:

我怎样才能实现这件事Drag and drop

4

5 回答 5

10

我假设您需要 Android 的此功能。最简单的方法是使用 Rect 类中的 intersects 方法。链接到文档。

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
}

*编辑添加缺少的右括号

于 2013-09-30T05:17:16.270 回答
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();
                                }

希望这可以帮助

于 2016-01-04T16:34:17.090 回答
2
 @override 
 onWindowFocusChanged(boolean focus) 

并将您的代码放在那里 cz onCreate()/onStart() - 这不起作用

于 2013-10-02T19:01:24.023 回答
1

您是否已经为第二个创建了拖放功能ImageView

如果是这样,您需要做的就是调用getLeft()、getRight() 等以在拖动后(或在拖动时每隔几个增量在 Handler 上)找到第二个视图的位置,然后这变得很简单矩形相交问题,这里已经有了答案

于 2013-09-30T05:16:46.037 回答
0

迟到的回复,但我也遇到了这个问题,并用以下代码修复了它。Action drop的解决方法在这里已经回答了,所以我不再发了。但是如果你想在拖动时检测它,你必须在里面做这些事情DragEvent.ACTION_DRAG_LOCATION

  1. 获取当前拖动事件的 xy:

    int x_cord = (int) event.getX();
    int y_cord = (int) event.getY();
    
  2. 现在计算矩形的大小。为此(在我的情况下)如果必须划分视图的大小,因为拖动位置在它的中心,然后计算上/左/右/下:

    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,则无需强制转换。

  1. 现在您可以使用这些值构建一个矩形:

    Rect rect = new Rect(left, top, right, bottom);
    
  2. 创建一个方法来检查矩形是否与您的 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);

我希望这能满足您的需求,如果不是,也许对其他人有帮助。

于 2017-01-21T09:16:54.930 回答