拖放时如何找到两个ImageView之间的相交?

时间:2013-09-30 05:07:42

标签: android imageview

我有两个ImageView

  1. 一个固定在某个位置
  2. On Second我需要应用拖放功能。
  3. 我需要什么:

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

    编辑1:

    相交b / w两个imageView为DONE,但在拖放时它没有发生。

    编辑2:

    如何在Drag and drop上实现此功能?

5 个答案:

答案 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内执行此操作。

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

    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);
    
  3. 我输入了值,因为在我的情况下,halfViewSize是float。如果您有integer,则无需投射。

    1. 现在您可以使用以下值构建一个rect:

      Rect rect = new Rect(left, top, right, bottom);
      
    2. 创建一个方法,检查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;
      }
      
    3. 现在你可以在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);
      

      我希望这符合您的需求,如果没有,也许对其他人有帮助。