Thursday, 24 September 2015

Android - Drag and Drop

Kerangka drag / drop Android memungkinkan pengguna untuk memindahkan data dari satu Lihat ke View lain dalam tata letak saat ini menggunakan drag grafis dan drop gesture. Sebagai API 11 drag dan drop pandang ke tampilan lain atau melihat kelompok adalah kerangka supported.The mencakup berikut tiga komponen penting untuk mendukung drag & drop fungsionalitas -

Drag acara kelas:

Drag pendengar:

Metode pembantu dan kelas:

Drag / Proses Drop
Pada dasarnya ada empat langkah atau negara dalam proses drag dan drop:

Mulai - Peristiwa ini terjadi ketika Anda mulai menyeret item dalam layout, aplikasi Anda panggilan startDrag () metode untuk memberitahu sistem untuk memulai tarik. Argumen dalam metode startDrag () memberikan data yang akan diseret, metadata untuk data ini, dan callback untuk menggambar hambatan bayangan.

Sistem ini pertama merespon dengan memanggil kembali ke aplikasi Anda untuk mendapatkan bayangan drag. Ini kemudian menampilkan hambatan bayangan pada perangkat.

Berikutnya, sistem akan mengirimkan ajang drag dengan jenis tindakan ACTION_DRAG_STARTED ke hambatan acara pendengar terdaftar untuk semua Lihat objek dalam tata letak saat.

Untuk terus menerima peristiwa drag, termasuk acara penurunan mungkin, pendengar ajang drag harus kembali benar, Jika pendengar ajang drag mengembalikan false, maka tidak akan menerima peristiwa tarik untuk operasi saat sampai sistem mengirimkan ajang drag dengan jenis tindakan ACTION_DRAG_ENDED.

Melanjutkan - Pengguna terus drag. Sistem mengirimkan tindakan ACTION_DRAG_ENTERED diikuti dengan tindakan ACTION_DRAG_LOCATION ke terdaftar ajang drag pendengar untuk Lihat di mana menyeret titik masuk. Pendengar dapat memilih untuk mengubah penampilan Lihat objek dalam menanggapi acara tersebut atau dapat bereaksi dengan menyorot View-nya.

Acara tarik pendengar menerima tindakan ACTION_DRAG_EXITED setelah pengguna telah pindah hambatan bayangan di luar kotak berlari dari View.

Menjatuhkan - Pengguna melepaskan item diseret dalam kotak berlari dari View. Sistem mengirimkan pendengar Lihat objek acara tarik dengan jenis tindakan ACTION_DROP.

Berakhir - Hanya setelah jenis tindakan ACTION_DROP, sistem mengirimkan sebuah ajang drag dengan jenis tindakan ACTION_DRAG_ENDED untuk menunjukkan bahwa operasi drag berakhir.

The DragEvent Kelas
The DragEvent merupakan acara yang dikirimkan oleh sistem pada berbagai waktu selama operasi drag dan drop. Kelas ini menyediakan beberapa Konstanta dan metode penting yang kita gunakan selama Drag / proses Gugurkan.

Konstanta
Berikut ini adalah semua konstanta bilangan bulat yang tersedia sebagai bagian dari kelas DragEvent.

 Konstanta & Keterangan

ACTION_DRAG_STARTED
Sinyal awal operasi drag dan drop.

ACTION_DRAG_ENTERED
Sinyal ke View bahwa titik tarik telah memasuki kotak berlari dari View.

ACTION_DRAG_LOCATION
Dikirim ke View setelah ACTION_DRAG_ENTERED jika hambatan bayangan masih dalam kotak berlari View objek.

ACTION_DRAG_EXITED
Sinyal bahwa pengguna telah pindah hambatan bayangan di luar kotak berlari dari View.

ACTION_DROP
Sinyal ke View bahwa pengguna telah merilis drag bayangan, dan titik drag dalam kotak berlari dari View.

ACTION_DRAG_ENDED
Sinyal ke View bahwa drag dan drop operasi telah menyimpulkan.

Metode
Berikut ini adalah beberapa metode penting dan paling sering digunakan tersedia sebagai bagian dari kelas DragEvent.

Konstanta & Keterangan

int getAction ()
Periksa nilai aksi acara ini ..

ClipData getClipData ()
Mengembalikan objek ClipData dikirim ke sistem sebagai bagian dari panggilan untuk startDrag ().

ClipDescription getClipDescription ()
Mengembalikan objek ClipDescription terkandung dalam ClipData.

boolean getResult ()
Pengembalian indikasi hasil drag dan drop operasi.

mengapung getX ()
Mendapatkan koordinat X titik drag.

mengapung getY ()
Mendapat Y koordinat titik drag.

String toString ()
Mengembalikan representasi string dari objek DragEvent ini.

Mendengarkan Drag Acara
Jika Anda ingin setiap pandangan Anda dalam Layout harus merespon event Drag maka pandangan Anda baik menerapkan View.OnDragListener atau setup onDragEvent (DragEvent) metode callback. Ketika sistem panggilan metode atau pendengar, melewati mereka objek DragEvent dijelaskan di atas. Anda dapat memiliki keduanya pendengar dan metode callback untuk View objek. Jika hal ini terjadi, sistem yang pertama panggilan pendengar dan kemudian didefinisikan callback selama pendengar mengembalikan true.

Kombinasi metode onDragEvent (DragEvent) dan View.OnDragListener analog dengan kombinasi dari onTouchEvent () dan View.OnTouchListener digunakan dengan peristiwa sentuhan di versi lama Android.

Memulai Drag
Anda mulai dengan menciptakan ClipData dan ClipData.Item untuk data yang dipindahkan. Sebagai bagian dari objek ClipData, pasokan metadata yang disimpan dalam sebuah objek ClipDescription dalam ClipData. Untuk drag dan drop operasi yang tidak mewakili gerakan data, Anda mungkin ingin menggunakan nol bukan sebuah objek yang sebenarnya.

Berikutnya baik Anda dapat memperpanjang memperpanjang View.DragShadowBuilder untuk membuat bayangan tarik untuk menyeret pandangan atau hanya Anda dapat menggunakan View.DragShadowBuilder (Lihat) untuk membuat bayangan tarik default yang adalah ukuran yang sama dengan View argumen berlalu untuk itu, dengan sentuhan titik berpusat di tarik bayangan.

Contoh
Berikut contoh menunjukkan fungsi dari Drag & Drop sederhana menggunakan View.setOnLongClickListener (), View.setOnTouchListener () dan View.OnDragEventListener ().

Langkah Keterangan

1 Anda akan menggunakan Android studio IDE untuk membuat aplikasi Android dan nama itu sebagai Aplikasi My bawah com.example.saira_000.myapplication paket. Sementara menciptakan proyek ini, pastikan Anda Targetkan SDK dan Kompilasi Dengan di versi terbaru dari Android SDK untuk menggunakan tingkat yang lebih tinggi dari API.

2 Modifikasi src / MainActivity.java berkas dan menambahkan kode untuk mendefinisikan pendengar acara serta panggilan kembali metode untuk gambar logo yang digunakan dalam contoh.

3 Copy gambar abc.png di res / drawable- folder *. Anda dapat menggunakan gambar dengan resolusi yang berbeda jika anda ingin memberikan mereka untuk berbagai perangkat.

4 Ubah tata letak file XML res / layout / activity_main.xml untuk menentukan tampilan default gambar logo.

5 Jalankan aplikasi untuk meluncurkan Android emulator dan memverifikasi hasil dari perubahan yang dilakukan dalam aplikasi.
Berikut ini adalah isi dari file utama kegiatan src / MainActivity.java dimodifikasi. File ini dapat mencakup setiap metode siklus hidup yang mendasar.

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

Berikut akan menjadi isi dari res file layout / / activity_main.xml -

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

Berikut akan menjadi isi dari res / values / strings.xml untuk mendefinisikan dua konstanta baru -

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="app_name">My Application</string>
   <string name="action_settings">Settings</string>
</resources>

Berikut ini adalah isi default 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>

Mari kita coba untuk menjalankan aplikasi Aplikasi Saya. Saya berasumsi bahwa Anda telah menciptakan AVD Anda saat melakukan pengaturan lingkungan. Untuk menjalankan aplikasi dari Android Studio, buka salah satu file kegiatan proyek Anda dan klik Run Run Eclipse Icon icon dari toolbar. Android studio menginstal aplikasi pada AVD Anda dan mulai itu dan jika semuanya baik-baik saja dengan setup dan aplikasi, maka akan muncul jendela berikut Emulator -

Sekarang jangan lama klik pada logo ditampilkan TutorialsPoint dan Anda akan melihat bahwa gambar logo bergerak sedikit setelah 1 detik klik jauh dari tempatnya, waktu ketika Anda harus mulai menyeret gambar. Anda dapat drag di sekitar layar dan menjatuhkannya di lokasi baru.

No comments:

Post a Comment