Cómo encontrar la intersección entre dos ImageView cuando arrastrar y soltar?

Tengo dos ImageView

  1. Uno se fija en una posición
  2. En segundo lugar, necesito aplicar una funcionalidad de arrastrar y soltar.

Lo que necesito:

Arrastre el segundo ImageView al otro ImageView y cuando se intersecten de lo que necesito para llamar a un método.

EDIT 1:

Intersect b / w dos imageView está DONE pero en la caída de arrastrar n no está sucediendo.

Editar 2:

¿Cómo puedo lograr esto en Drag and drop ?

Supongo que necesitas esta funcionalidad para Android. La forma más fácil es utilizar el método de intersección encontrado en la clase Rect. Enlace a la documentación.

 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 } 

* EDIT añadió el soporte derecho faltante

Esta es mi solución que funciona

 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)); } 

Llamar a la función anterior en

 @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(); } 

Espero que esto ayude

  @override onWindowFocusChanged(boolean focus) 

Y poner su código allí cz onCreate () / onStart () – esto no funcionará

¿Ya tiene la funcionalidad de arrastrar y soltar creada para el segundo ImageView ?

Si es así, todo lo que necesitas hacer es llamar a getLeft (), getRight (), así sucesivamente para encontrar la posición de tu segunda vista después de la arrastrar (o en un handler cada pocos incrementos mientras está siendo arrastrado), entonces esto se convierte en un simple Problema de intersección de rectángulo, que ya tiene una respuesta aquí .

En tiempo de ejecución, puede obtener la ubicación de cada objeto de View (esto también incluye Layouts ) con

Posición izquierda de la vista Objeto getleft()

Posición superior del objeto de vista getTop()

Posición derecha del objeto de vista getRight()

Posición inferior de la vista Objeto getBottom()

Incluso puede obtener la ubicación con

 getLocationOnScreen(int [] ) 

Usted puede obtener la posición de Ambos View es decir, su ImageView y comparar con ella. Pero como @interrupt es la mejor manera de encontrar la intersección.

Respuesta tardía, pero también tuve este problema y lo arreglé con el código siguiente. La solución para la caída de Acción se responde aquí, así que no la vuelvo a publicar. Pero si desea detectarlo mientras se DRAGGING , tiene que hacer esas cosas dentro de DragEvent.ACTION_DRAG_LOCATION .

  1. Obtener xy del evento de arrastre actual:

     int x_cord = (int) event.getX(); int y_cord = (int) event.getY(); 
  2. Ahora calcula el tamaño del rect. Para eso (en mi caso) si tiene que dividir el tamaño de la vista porque la posición de arrastre estaba en el centro de ella y luego calcular la parte superior / izquierda / derecha / abajo:

     int left = (int) (x_cord - halfViewSize); int top = (int) (y_cord - halfViewSize); int right = (int) (x_cord + halfVaieSize); int bottom = (int) (y_cord + halfViewSize); 

Yo casted el valor, porque en mi caso, halfViewSize era un float . Si tiene un integer , no necesita emitir.

  1. Ahora puede construir un rec con estos valores:

     Rect rect = new Rect(left, top, right, bottom); 
  2. Crear un método que comprueba si el rect se intersecta con un rect de su hijoVista:

     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; } 

Ahora puedes hacer esto dentro de 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); 

Espero que esto se ajuste a sus necesidades, si no, tal vez es útil para los demás.

  • El video no se detiene en el fragmento ViewPager
  • Cómo poner vistas en la parte superior de un ImageView, en relación con el tamaño del contenido de ImageView?
  • Android, Java, Creación de una miniatura que mantiene la relación de aspecto
  • ImageView no mostrará la imagen cuando se establezca por setImageBitmap ()
  • Mostrar la imagen de réplica con imagen especular en android
  • El selector no funciona con el diseño y la vista de imagen
  • Cómo recortar Bitmap Center like imageview?
  • Cambiar el tamaño de ImageView para ajustarse a la relación de aspecto
  • Ampliación de ImageView TOP_CROP
  • Imagen de Android que fija el tamaño de la imagen
  • Cómo crear una imagen giratoria controlada por gestos para una interfaz de usuario
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.