Cómo encontrar la intersección entre dos ImageView cuando arrastrar y soltar?
Tengo dos ImageView
- Uno se fija en una posición
- En segundo lugar, necesito aplicar una funcionalidad de arrastrar y soltar.
Lo que necesito:
- Cómo agregar una sombra y un borde en circular imageView android?
- Ponga un botón sobre un ImageView
- Cambiar imagen de ImageView por programación Android
- Seleccione una parte de la imagen en ImageView y obtenga los puntos finales del rectángulo seleccionado
- ¿Cuál es la diferencia entre ImageView.ScaleType.CENTER_INSIDE y FIT_CENTER?
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
?
- Escala de imagen para rellenar el ancho de ImageView y mantener la relación de aspecto
- La aplicación se bloquea al agregar un ImageView
- ImageView muestra espacio en blanco en la parte superior e inferior de la imagen
- ¿Cómo podemos establecer altura y anchura dp para imageview en android?
- Android agrega programaticamente ImageView
- Establecer imagen desde android.R.drawable en vista de la imagen android
- Necesita ayuda para mostrar el texto del mensaje con imágenes como una lista
- Cómo cambiar dinámicamente la altura de ImageView
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
.
-
Obtener xy del evento de arrastre actual:
int x_cord = (int) event.getX(); int y_cord = (int) event.getY();
-
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.
-
Ahora puede construir un rec con estos valores:
Rect rect = new Rect(left, top, right, bottom);
-
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.
- Inicio del servicio de fondo cuando se enciende Android
- ¿Es un servicio de Android un proceso o hilo?