Android Drag / Drop-Framework ermöglicht den Benutzern, Daten von einer Ansicht zu einer anderen Ansicht im aktuellen Layout zu bewegen mit Hilfe einer grafischen Drag & Drop-Geste. Wie der API 11 Drag & Drop der Blick auf andere Ansichten oder sehen Gruppen supported.The Framework umfasst drei wichtige Komponenten, um den Widerstand zu unterstützen & Drop-Funktionalität -
- Ziehen Sie die Ereignisklasse:
- Ziehen Sie die Zuhörer:
- Helper Methoden und Klassen:
Das Ziehen / Ablegen Prozess
Grundsätzlich gibt es vier Stufen oder Zustände in der Drag & Drop-Prozess:
- Started - Dieses Ereignis tritt auf, wenn Sie beginnen Ziehen eines Elements in einem Layout, ruft die Anwendung startdrag () Methode, um dem System mitzuteilen, um eine Drag starten. Die Argumente innerhalb startdrag () -Methode bieten die Daten, die gezogen werden, Metadaten für diese Daten und einen Callback für das Zeichnen der Drag Schatten.Das System reagiert erst durch den Aufruf zurück zu Ihrer Anwendung, um eine Drag Schatten zu bekommen. Es zeigt dann die Drag Schatten auf das Gerät.Als nächstes sendet das System eine Ziehereignis mit AktionstypACTION_DRAG_STARTED an die registrierten Drag Ereignis-Listener für alle View-Objekte im aktuellen Layout.Um weiterhin Drag Veranstaltungen, einschließlich einer möglichen Drop-Ereignis, ein Drag-Ereignis-Listener muss zurück zu empfangenwahr, Wenn das Drag-Ereignis-Listener false zurückgibt, dann wird es nicht ziehen Sie Ereignisse für den aktuellen Vorgang zu erhalten, bis das System sendet eine Ziehereignis mit Aktionstyp ACTION_DRAG_ENDED.
- Weiterbildung - Der Benutzer setzt den Luftwiderstand. System sendet ACTION_DRAG_ENTERED Aktion gefolgt von ACTION_DRAG_LOCATION Aktion an die registrierte Drag Ereignis-Listener für die Ansicht verschieben, wo Punkt eintritt. Die Zuhörer können das Aussehen ihrer Ansicht Gegenstand in Reaktion auf das Ereignis ändern oder durch Hervorhebung seiner Ansicht reagieren.Die Drag-Ereignis Listener über ein ACTION_DRAG_EXITED Aktion, nachdem der Benutzer die Drag Schatten außerhalb des Begrenzungsrahmens der Ansicht verschoben.
- Dropped - Der Benutzer das gezogene Element innerhalb der Begrenzungsrahmen von einem Blick freigibt. Das System sendet Hörers das View-Objekt eine Ziehereignis mit Aktionstyp ACTION_DROP.
- Beendet - Kurz nach dem Aktionstyp ACTION_DROP, sendet das System eine Ziehereignis mit Aktionstyp ACTION_DRAG_ENDED, um anzuzeigen, dass die Drag-Operation ist vorbei.
Die Dragevent-Klasse
Die Dragevent stellt ein Ereignis dar, das durch das System zu verschiedenen Zeiten während eines Drag & Drop-Operation gesendet wird. Diese Klasse stellt einige Konstanten und wichtige Methoden, die wir während der Drag / Drop-Prozess verwenden.
Konstanten
Im Folgenden sind alle Konstanten ganzen Zahlen als Teil des Dragevent-Klasse zur Verfügung.
Sr.No. | Konstanten & Beschreibung |
---|---|
1 | ACTION_DRAG_STARTED
Signale der Beginn eines Drag & Drop-Operation.
|
2 | ACTION_DRAG_ENTERED
Signale zu einer Ansicht, dass die Schlepppunkt des Begrenzungsrahmens der Ansicht eingetragen.
|
3 | ACTION_DRAG_LOCATION
Einer Ansicht nach ACTION_DRAG_ENTERED gesendet, wenn der Drag Schatten ist noch im Begrenzungsrahmen des View-Objekt.
|
4 | ACTION_DRAG_EXITED
Signale, die der Benutzer die Drag Schatten außerhalb des Begrenzungsrahmens der Ansicht verschoben.
|
5 | ACTION_DROP
Signale zu einer Ansicht, dass der Benutzer die Drag Schatten freigegeben, und die Schlepppunkt innerhalb des Begrenzungsrahmens der Ansicht.
|
6 | ACTION_DRAG_ENDED
Signale zu einer Ansicht, dass die Drag & Drop-Vorgang abgeschlossen ist.
|
Methoden
Im Folgenden sind einige wichtige und am häufigsten gebrauchten Methoden als Teil der Dragevent-Klasse zur Verfügung.
Sr.No. | Konstanten & Beschreibung |
---|---|
1 | int getAction ()
Untersuchen Sie den Auslösewert der Veranstaltung ..
|
2 | ClipData getClipData ()
Gibt die ClipData Objekt an das System im Rahmen der Aufruf startdrag () gesendet.
|
3 | ClipDescription getClipDescription ()
Gibt den in der ClipData enthaltenen ClipDescription Objekt.
|
4 | boolean getResult ()
Gibt eine Angabe über das Ergebnis der Drag & Drop-Operation.
|
5 | schweben getX ()
Ruft die X-Koordinate des Schlepppunkt.
|
6 | schweben getY ()
Ruft die Y-Koordinate des Schlepppunkt.
|
7 | String toString ()
Gibt eine Stringdarstellung dieses Dragevent-Objekts.
|
Hören für Drag-Ereignis
Wenn Sie alle Ihre Ansichten innerhalb eines Layouts wollen, sollten Drag Ereignis reagieren dann Ihrer Meinung nach entweder implementiertView.OnDragListener oder Setup onDragEvent (Dragevent) Callback-Methode. Wenn das System das Verfahren oder Zuhörer aufruft, wird sie zu einer Drag Objekt oben erläutert. Sie können sowohl einen Listener und Callback-Methode für das Objekt anzuzeigen. Wenn dies der Fall ist, ruft das System zuerst den Hörer und dann Callback solange Zuhörer true zurück.
Die Kombination aus dem onDragEvent (Dragevent) Verfahren undView.OnDragListener ist analog zu der Kombination der onTouchEvent () undView.OnTouchListener mit Touch-Ereignisse in alten Versionen von Android verwendet.
Starten einer Drag-Ereignis
Sie beginnen mit der Erstellung einer ClipData und ClipData.Item für die Daten bewegt. Als Teil der ClipData Objekt, Versorgungs Metadaten, die in einer gespeicherten ClipDescription Objekt innerhalb des ClipData. Für eine Drag & Drop-Operation, die keine Datenbewegung nicht zu vertreten, können Sie verwenden null anstelle eines tatsächlichen Objekts.
Weiter können Sie entweder zu verlängern verlängernView.DragShadowBuilder einen Drag Schatten für das Ziehen die Ansicht zu erstellen oder einfach können Sie verwenden View.DragShadowBuilder (View),um einen Standard Drag Schatten, der die gleiche Größe wie der Blick Argument übergebenen ist zu erstellen, mit dem Touch- Punkt in der Drag Schatten zentriert.
Beispiel
Folgendes Beispiel zeigt die Funktionalität von einem einfachen Drag & Drop mit View.setOnLongClickListener (), View.setOnTouchListener () undView.OnDragEventListener ().
Schritt | Bezeichnung |
---|---|
1 | Sie werden Android-Studio IDE verwenden, um ein Android-Anwendung erstellen und benennen es als meine Anwendung unter einem Paketcom.example.saira_000.myapplication. Bei der Erstellung dieses Projekt, stellen Sie sicher SDK Ziel und Kompilieren Sie mit bei der neuesten Version des Android SDK zu höheren Ebenen der APIs verwenden. |
2 | Ändern src / MainActivity.java Datei und fügen Sie den Code zur Ereignis-Listener zu definieren sowie eine Rückrufmethoden für die Logo-Bild im Beispiel verwendet. |
3 | Kopieren Sie die Bild abc.png in res / drawable- * Ordner. Sie können Bilder mit unterschiedlicher Auflösung auf, falls Sie sie für verschiedene Geräte zur Verfügung stellen möchten verwenden. |
4 | Ändern Sie das Layout XML-Datei res / layout / activity_main.xml zur Standardansicht der Logo-Bilder definieren. |
5 | Führen Sie die Anwendung auf Android-Emulator zu starten, und überprüfen Sie das Ergebnis der Änderungen in der Anwendung durchgeführt. |
Im Folgenden ist der Gehalt des modifizierten Haupttätigkeit Datei src /MainActivity.java. Diese Datei kann jede der Grundzyklus Verfahren umfassen.
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; } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
Im Anschluss wird der Inhalt sein res / layout / activity_main.xml Datei -
<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>
Im Anschluss wird der Inhalt sein res / Werte / strings.xml zwei neue Konstanten definieren -
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My Application</string> <string name="action_settings">Settings</string> </resources>
Im Folgenden ist der Standardinhalt der AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.guidemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.guidemo.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>
Lasst uns versuchen, Ihre Lauf My Application Anwendung. Ich nehme an, Sie geschaffen hatte AVD dabei Umgebungskonfiguration. Um die App vom Android Studio, öffnen Sie eine Aktivität Dateien Ihres Projekt auszuführen, und klicken Sie auf
Ausführen-Symbol in der Symbolleiste. Android-Studio installiert die App auf Ihrem AVD und startet es und wenn alles in Ordnung ist mit der Einrichtung und Anwendung, wird es folgende Emulator-Fenster anzuzeigen -
Jetzt klicken Sie nicht lange auf dem angezeigten TutorialsPoint Logo und Sie werden sehen, dass Logobild bewegt sich ein wenig nach 1 Sekunde langes Drücken von seinem Platz, ihre Zeit, wenn Sie beginnen sollten Sie das Bild. Sie können es über den Bildschirm per Drag & Drop auf eine neue Position.
0 التعليقات:
Kommentar veröffentlichen