Android - Sürükle ve Bırak
Android sürükle / bırak çerçevesi, kullanıcılarınızın verileri grafiksel bir sürükle ve bırak hareketini kullanarak mevcut düzendeki bir Görünümden başka bir Görünüme taşımasına olanak tanır. İtibariyleAPI 11 görünümü diğer görünümlere veya görünüm gruplarına sürükleyip bırakma desteklenir. Çerçeve, sürükle ve bırak işlevini desteklemek için aşağıdaki üç önemli bileşeni içerir -
Drag event class.
Drag listeners.
Helper methods and classes.
Sürükle / Bırak İşlemi
Sürükle ve bırak işleminde temel olarak dört adım veya durum vardır -
Started - Bu olay, bir düzende bir öğeyi sürüklemeye başladığınızda meydana gelir, uygulamanız sisteme bir sürüklemeyi başlatmasını söylemek için startDrag () yöntemini çağırır . StartDrag () yönteminin içindeki argümanlar, sürüklenecek verileri, bu veriler için meta verileri ve sürükleme gölgesini çizmek için bir geri arama sağlar.
Sistem önce bir sürükleme gölgesi elde etmek için uygulamanızı geri arayarak yanıt verir. Daha sonra cihazda sürükleme gölgesini görüntüler.
Daha sonra sistem , geçerli düzendeki tüm View nesneleri için kayıtlı drag olayı dinleyicilerine ACTION_DRAG_STARTED eylem tipi ile bir drag olayı gönderir .
Olası bir bırakma olayı da dahil olmak üzere drag olaylarını almaya devam etmek için bir drag olayı dinleyicisi geri dönmelidir true, Drag olay dinleyicisi false değerini döndürürse, sistem ACTION_DRAG_ENDED eylem türüne sahip bir drag olayı gönderene kadar mevcut işlem için drag olaylarını almayacaktır.
Continuing- Kullanıcı sürüklemeye devam eder. Sistem, sürükleme noktasının girdiği Görünüm için kayıtlı drag olayı dinleyicisine ACTION_DRAG_ENTERED eylemini ve ardından ACTION_DRAG_LOCATION eylemini gönderir. Dinleyici, olaya yanıt olarak View nesnesinin görünümünü değiştirmeyi seçebilir veya Görünümünü vurgulayarak tepki verebilir.
Kullanıcı sürükleme gölgesini Görünümün sınırlayıcı kutusunun dışına taşıdıktan sonra, sürükleme olay dinleyicisi bir ACTION_DRAG_EXITED işlemi alır.
Dropped- Kullanıcı, sürüklenen öğeyi bir Görünümün sınırlayıcı kutusu içinde serbest bırakır. Sistem, View nesnesinin dinleyicisine ACTION_DROP eylem tipi ile bir drag olayı gönderir.
Ended - ACTION_DROP eylem türünün hemen ardından, sistem, sürükleme işleminin bittiğini belirtmek için ACTION_DRAG_ENDED eylem türünde bir sürükleme olayı gönderir.
DragEvent Sınıfı
DragEventSürükle ve bırak işlemi sırasında sistem tarafından çeşitli zamanlarda gönderilen bir olayı temsil eder. Bu sınıf, Sürükle / Bırak işlemi sırasında kullandığımız birkaç Sabiti ve önemli yöntemleri sağlar.
Sabitler
Aşağıda, DragEvent sınıfının bir parçası olarak kullanılabilen tüm sabit tam sayılar verilmiştir.
Sr.No. | Sabitler ve Açıklama |
---|---|
1 |
ACTION_DRAG_STARTED Sürükle ve bırak işleminin başlangıcını işaret eder. |
2 |
ACTION_DRAG_ENTERED Sürükleme noktasının Görünümün sınırlayıcı kutusuna girdiğini gösteren bir Görünüme işaret eder. |
3 | ACTION_DRAG_LOCATION Sürükleme gölgesi hala View nesnesinin sınırlayıcı kutusunun içindeyse ACTION_DRAG_ENTERED'den sonra bir Görünüme gönderilir. |
4 | ACTION_DRAG_EXITED Kullanıcının sürükleme gölgesini Görünüm'ün sınırlayıcı kutusunun dışına taşıdığını gösterir. |
5 | ACTION_DROP Kullanıcının sürükleme gölgesini bıraktığını ve sürükleme noktasının Görünüm'ün sınırlayıcı kutusu içinde olduğunu bir Görünüme işaret eder. |
6 |
ACTION_DRAG_ENDED Sürükle ve bırak işleminin sona erdiği bir Görünüme işaret eder. |
Yöntemler
Aşağıda, DragEvent sınıfının bir parçası olarak bulunan birkaç önemli ve en sık kullanılan yöntem bulunmaktadır.
Sr.No. | Sabitler ve Açıklama |
---|---|
1 | int getAction() Bu etkinliğin eylem değerini inceleyin .. |
2 | ClipData getClipData() StartDrag () çağrısının bir parçası olarak sisteme gönderilen ClipData nesnesini döndürür. |
3 |
ClipDescription getClipDescription() ClipData'da bulunan ClipDescription nesnesini döndürür. |
4 |
boolean getResult() Sürükle ve bırak işleminin sonucunun bir göstergesini döndürür. |
5 |
float getX() Sürükleme noktasının X koordinatını alır. |
6 | float getY() Sürükleme noktasının Y koordinatını alır. |
7 | String toString() Bu DragEvent nesnesinin dize temsilini döndürür. |
Drag Olayını Dinleme
Bir Düzen içindeki görünümlerinizden herhangi birinin Sürükle olayına yanıt vermesini istiyorsanız, görünümünüz ya View.OnDragListener veya kurulum onDragEvent(DragEvent)geri arama yöntemi. Sistem yöntemi veya dinleyiciyi çağırdığında, onlara yukarıda açıklanan bir DragEvent nesnesi iletir. View nesnesi için hem bir dinleyiciye hem de bir geri çağrı yöntemine sahip olabilirsiniz. Böyle bir durumda, sistem önce dinleyiciyi çağırır ve ardından dinleyici true döndürdüğü sürece geri aramayı tanımlar.
Kombinasyonu onDragEvent (DragEvent) yöntemi ve View.OnDragListener kombinasyonu benzerdironTouchEvent() ve View.OnTouchListener Android'in eski sürümlerinde dokunma etkinlikleriyle kullanılır.
Drag Olayı Başlatma
Bir yaratarak başlayın ClipData ve ClipData.Itemtaşınan veriler için. ClipData nesnesinin bir parçası olarak, birClipDescriptionClipData içindeki nesne. Veri hareketini temsil etmeyen bir sürükle ve bırak işlemi için kullanmak isteyebilirsiniz.null gerçek bir nesne yerine.
Sonra ya uzatabilirsiniz View.DragShadowBuilderGörünümü sürüklemek için bir sürükleme gölgesi oluşturmak için veya sadece View.DragShadowBuilder'ı (View) kullanarak, sürükleme gölgesinde ortalanmış temas noktasıyla kendisine iletilen View bağımsız değişkeniyle aynı boyutta bir varsayılan sürükleme gölgesi oluşturabilirsiniz.
Misal
Aşağıdaki örnek, basit bir Sürükle ve Bırak işleminin işlevselliğini göstermektedir. View.setOnLongClickListener(), View.setOnTouchListener()ve View.OnDragEventListener().
Adım | Açıklama |
---|---|
1 | Bir Android uygulaması oluşturmak için Android studio IDE'yi kullanacaksınız ve bunu com.example.saira_000.myapplication paketinin altında Uygulamam olarak adlandıracaksınız . |
2 | Src / MainActivity.java dosyasını değiştirin ve olay dinleyicilerini tanımlamak için kodu ve ayrıca örnekte kullanılan logo görüntüsü için geri arama yöntemlerini ekleyin. |
3 | Res / drawable- * klasörlerine resim abc.png kopyalayın . Farklı cihazlar için sağlamak istemeniz durumunda farklı çözünürlükteki resimleri kullanabilirsiniz. |
4 | Logo resimlerinin varsayılan görünümünü tanımlamak için düzen XML dosyasını res / layout / activity_main.xml'yi değiştirin. |
5 | Android öykünücüsünü başlatmak ve uygulamada yapılan değişikliklerin sonucunu doğrulamak için uygulamayı çalıştırın. |
Aşağıda, değiştirilen ana aktivite dosyasının içeriği yer almaktadır src/MainActivity.java. Bu dosya, temel yaşam döngüsü yöntemlerinin her birini içerebilir.
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şağıdakilerin içeriği olacak res/layout/activity_main.xml dosya -
Aşağıdaki kodda abc, tutorialspoint.com logosunu gösterir.
<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şağıdakilerin içeriği olacak res/values/strings.xml iki yeni sabit tanımlamak için -
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Application</string>
</resources>
Aşağıdaki varsayılan içeriktir 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>
Hadi çalıştırmayı deneyelim My Applicationuygulama. Senin yarattığını varsayıyorumAVDortam kurulumu yapılırken. Uygulamayı Android Studio'dan çalıştırmak için, projenizin etkinlik dosyalarından birini açın
Şimdi görüntülenen TutorialsPoint logosuna uzun tıklayın ve logo görüntüsünün bulunduğu yerden 1 saniye uzun bir tıklama sonrasında biraz hareket ettiğini göreceksiniz, bu, resmi sürüklemeye başlamanız gereken zamandır. Bunu ekranın etrafında sürükleyip yeni bir konuma bırakabilirsiniz.