Android: arrastrar y soltar
El marco de trabajo de arrastrar / soltar de Android permite a sus usuarios mover datos de una Vista a otra Vista en el diseño actual usando un gesto gráfico de arrastrar y soltar. A partir deAPI 11 Se admite arrastrar y soltar la vista en otras vistas o grupos de vistas. El marco incluye los siguientes tres componentes importantes para admitir la funcionalidad de arrastrar y soltar:
Drag event class.
Drag listeners.
Helper methods and classes.
El proceso de arrastrar / soltar
Básicamente, hay cuatro pasos o estados en el proceso de arrastrar y soltar:
Started - Este evento ocurre cuando comienza a arrastrar un elemento en un diseño, su aplicación llama al método startDrag () para decirle al sistema que comience a arrastrar. Los argumentos dentro del método startDrag () proporcionan los datos que se van a arrastrar, metadatos para estos datos y una devolución de llamada para dibujar la sombra de arrastre.
El sistema responde primero volviendo a llamar a su aplicación para obtener una sombra de arrastre. Luego muestra la sombra de arrastre en el dispositivo.
A continuación, el sistema envía un evento de arrastre con el tipo de acción ACTION_DRAG_STARTED a los oyentes de eventos de arrastre registrados para todos los objetos de Vista en el diseño actual.
Para continuar recibiendo eventos de arrastre, incluido un posible evento de caída, un detector de eventos de arrastre debe regresar true, Si el detector de eventos de arrastre devuelve falso, no recibirá eventos de arrastre para la operación actual hasta que el sistema envíe un evento de arrastre con el tipo de acción ACTION_DRAG_ENDED.
Continuing- El usuario continúa arrastrando. El sistema envía la acción ACTION_DRAG_ENTERED seguida de la acción ACTION_DRAG_LOCATION al detector de eventos de arrastre registrado para la Vista donde entra el punto de arrastre. El oyente puede optar por alterar la apariencia de su objeto Vista en respuesta al evento o puede reaccionar resaltando su Vista.
El detector de eventos de arrastre recibe una acción ACTION_DRAG_EXITED después de que el usuario ha movido la sombra de arrastre fuera del cuadro delimitador de la Vista.
Dropped- El usuario suelta el elemento arrastrado dentro del cuadro delimitador de una vista. El sistema envía al oyente del objeto View un evento de arrastre con el tipo de acción ACTION_DROP.
Ended - Justo después del tipo de acción ACTION_DROP, el sistema envía un evento de arrastre con el tipo de acción ACTION_DRAG_ENDED para indicar que la operación de arrastre ha terminado.
La clase DragEvent
los DragEventrepresenta un evento que envía el sistema en varios momentos durante una operación de arrastrar y soltar. Esta clase proporciona pocas constantes y métodos importantes que usamos durante el proceso de arrastrar / soltar.
Constantes
A continuación se muestran todos los enteros constantes disponibles como parte de la clase DragEvent.
No Señor. | Constantes y descripción |
---|---|
1 |
ACTION_DRAG_STARTED Señala el inicio de una operación de arrastrar y soltar. |
2 |
ACTION_DRAG_ENTERED Señala a una vista que el punto de arrastre ha entrado en el cuadro delimitador de la vista. |
3 | ACTION_DRAG_LOCATION Enviado a una vista después de ACTION_DRAG_ENTERED si la sombra de arrastre todavía está dentro del cuadro delimitador del objeto de vista. |
4 | ACTION_DRAG_EXITED Señala que el usuario ha movido la sombra de arrastre fuera del cuadro delimitador de la Vista. |
5 | ACTION_DROP Señala a una vista que el usuario ha liberado la sombra de arrastre y que el punto de arrastre está dentro del cuadro delimitador de la vista. |
6 |
ACTION_DRAG_ENDED Señala a una vista que la operación de arrastrar y soltar ha concluido. |
Métodos
A continuación se muestran algunos métodos importantes y de uso más frecuente disponibles como parte de la clase DragEvent.
No Señor. | Constantes y descripción |
---|---|
1 | int getAction() Inspeccione el valor de acción de este evento. |
2 | ClipData getClipData() Devuelve el objeto ClipData enviado al sistema como parte de la llamada a startDrag (). |
3 |
ClipDescription getClipDescription() Devuelve el objeto ClipDescription contenido en ClipData. |
4 |
boolean getResult() Devuelve una indicación del resultado de la operación de arrastrar y soltar. |
5 |
float getX() Obtiene la coordenada X del punto de arrastre. |
6 | float getY() Obtiene la coordenada Y del punto de arrastre. |
7 | String toString() Devuelve una representación de cadena de este objeto DragEvent. |
Escuchando el evento de arrastre
Si desea que alguna de sus vistas dentro de un diseño responda al evento de arrastre, entonces su vista implementa View.OnDragListener o configuración onDragEvent(DragEvent)método de devolución de llamada. Cuando el sistema llama al método o al oyente, les pasa un objeto DragEvent explicado anteriormente. Puede tener un oyente y un método de devolución de llamada para el objeto View. Si esto ocurre, el sistema primero llama al oyente y luego define la devolución de llamada siempre que el oyente devuelva verdadero.
La combinación del método onDragEvent (DragEvent) y View.OnDragListener es análoga a la combinación delonTouchEvent() y View.OnTouchListener utilizado con eventos táctiles en versiones antiguas de Android.
Iniciar un evento de arrastre
Empiece por crear un ClipData y ClipData.Itempara los datos que se mueven. Como parte del objeto ClipData , proporcione metadatos almacenados en unClipDescriptionobjeto dentro de ClipData. Para una operación de arrastrar y soltar que no representa el movimiento de datos, es posible que desee utilizarnull en lugar de un objeto real.
A continuación, puede extender extender View.DragShadowBuilderpara crear una sombra de arrastre para arrastrar la vista o simplemente puede usar View.DragShadowBuilder (Ver) para crear una sombra de arrastre predeterminada que es del mismo tamaño que el argumento de Vista que se le pasó, con el punto táctil centrado en la sombra de arrastre.
Ejemplo
El siguiente ejemplo muestra la funcionalidad de un simple arrastrar y soltar usando View.setOnLongClickListener(), View.setOnTouchListener()y View.OnDragEventListener().
Paso | Descripción |
---|---|
1 | Utilizará Android Studio IDE para crear una aplicación de Android y nombrarla como Mi aplicación en un paquete com.example.saira_000.myapplication . |
2 | Modifique el archivo src / MainActivity.java y agregue el código para definir detectores de eventos, así como métodos de devolución de llamada para la imagen del logotipo utilizada en el ejemplo. |
3 | Copie la imagen abc.png en las carpetas res / drawable- * . Puede utilizar imágenes con diferente resolución en caso de que desee proporcionarlas para diferentes dispositivos. |
4 | Modifique el archivo XML de diseño res / layout / activity_main.xml para definir la vista predeterminada de las imágenes del logotipo. |
5 | Ejecute la aplicación para iniciar el emulador de Android y verifique el resultado de los cambios realizados en la aplicación. |
A continuación se muestra el contenido del archivo de actividad principal modificado src/MainActivity.java. Este archivo puede incluir cada uno de los métodos fundamentales del ciclo de vida.
package com.example.saira_000.myapplication;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipDescription;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.DragEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class MainActivity extends Activity {
ImageView img;
String msg;
private android.widget.RelativeLayout.LayoutParams layoutParams;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img=(ImageView)findViewById(R.id.imageView);
img.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ClipData.Item item = new ClipData.Item((CharSequence)v.getTag());
String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData dragData = new ClipData(v.getTag().toString(),mimeTypes, item);
View.DragShadowBuilder myShadow = new View.DragShadowBuilder(img);
v.startDrag(dragData,myShadow,null,0);
return true;
}
});
img.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
switch(event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
layoutParams = (RelativeLayout.LayoutParams)v.getLayoutParams();
Log.d(msg, "Action is DragEvent.ACTION_DRAG_STARTED");
// Do nothing
break;
case DragEvent.ACTION_DRAG_ENTERED:
Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENTERED");
int x_cord = (int) event.getX();
int y_cord = (int) event.getY();
break;
case DragEvent.ACTION_DRAG_EXITED :
Log.d(msg, "Action is DragEvent.ACTION_DRAG_EXITED");
x_cord = (int) event.getX();
y_cord = (int) event.getY();
layoutParams.leftMargin = x_cord;
layoutParams.topMargin = y_cord;
v.setLayoutParams(layoutParams);
break;
case DragEvent.ACTION_DRAG_LOCATION :
Log.d(msg, "Action is DragEvent.ACTION_DRAG_LOCATION");
x_cord = (int) event.getX();
y_cord = (int) event.getY();
break;
case DragEvent.ACTION_DRAG_ENDED :
Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENDED");
// Do nothing
break;
case DragEvent.ACTION_DROP:
Log.d(msg, "ACTION_DROP event");
// Do nothing
break;
default: break;
}
return true;
}
});
img.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
ClipData data = ClipData.newPlainText("", "");
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(img);
img.startDrag(data, shadowBuilder, img, 0);
img.setVisibility(View.INVISIBLE);
return true;
} else {
return false;
}
}
});
}
}
A continuación se mostrará el contenido de res/layout/activity_main.xml archivo -
En el siguiente código abc indica el logo de tutorialspoint.com
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Drag and Drop Example"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials Point"
android:id="@+id/textView2"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:textSize="30dp"
android:textColor="#ff14be3c" />>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/abc"
android:layout_below="@+id/textView2"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2"
android:layout_alignLeft="@+id/textView2"
android:layout_alignStart="@+id/textView2" />
</RelativeLayout>
A continuación se mostrará el contenido de res/values/strings.xml para definir dos nuevas constantes -
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Application</string>
</resources>
A continuación se muestra el contenido predeterminado de AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.saira_000.myapplication" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Intentemos ejecutar tu My Applicationsolicitud. Supongo que habías creado tuAVDmientras realiza la configuración del entorno. Para ejecutar la aplicación desde Android Studio, abra uno de los archivos de actividad de su proyecto y haga clic en el icono Ejecutar en la barra de herramientas. Android Studio instala la aplicación en su AVD y la inicia y, si todo está bien con su configuración y aplicación, se mostrará la siguiente ventana del emulador:
Ahora haga clic largo en el logo de TutorialsPoint que se muestra y verá que la imagen del logo se mueve un poco después de hacer clic largo de 1 segundo desde su lugar, es el momento en el que debe comenzar a arrastrar la imagen. Puede arrastrarlo por la pantalla y soltarlo en una nueva ubicación.