Android-ドラッグアンドドロップ

Androidのドラッグアンドドロップフレームワークを使用すると、ユーザーはグラフィカルなドラッグアンドドロップジェスチャを使用して、現在のレイアウトのあるビューから別のビューにデータを移動できます。現在API 11 他のビューまたはビューグループへのビューのドラッグアンドドロップがサポートされています。フレームワークには、ドラッグアンドドロップ機能をサポートするための次の3つの重要なコンポーネントが含まれています。

  • Drag event class

  • Drag listeners

  • Helper methods and classes

ドラッグアンドドロッププロセス

ドラッグアンドドロッププロセスには、基本的に4つのステップまたは状態があります-

  • Started −このイベントは、レイアウト内のアイテムのドラッグを開始すると発生します。アプリケーションはstartDrag()メソッドを呼び出して、ドラッグを開始するようにシステムに指示します。startDrag()メソッド内の引数は、ドラッグされるデータ、このデータのメタデータ、およびドラッグシャドウを描画するためのコールバックを提供します。

    システムは最初にアプリケーションにコールバックしてドラッグシャドウを取得することで応答します。次に、デバイスにドラッグシャドウを表示します。

    次に、システムは、アクションタイプACTION_DRAG_STARTEDのドラッグイベントを、現在のレイアウト内のすべてのビューオブジェクトの登録済みドラッグイベントリスナーに送信します。

    ドロップイベントの可能性を含むドラッグイベントを引き続き受信するには、ドラッグイベントリスナーが戻る必要があります true、ドラッグイベントリスナーがfalseを返した場合、システムがアクションタイプACTION_DRAG_ENDEDのドラッグイベントを送信するまで、現在の操作のドラッグイベントを受信しません。

  • Continuing−ユーザーはドラッグを続行します。システムは、ACTION_DRAG_ENTEREDアクションに続いてACTION_DRAG_LOCATIONアクションを、ドラッグポイントが入るビューの登録済みドラッグイベントリスナーに送信します。リスナーは、イベントに応じてビューオブジェクトの外観を変更するか、ビューを強調表示して反応するかを選択できます。

    ドラッグイベントリスナーは、ユーザーがドラッグシャドウをビューのバウンディングボックスの外に移動した後、ACTION_DRAG_EXITEDアクションを受け取ります。

  • Dropped−ユーザーは、ビューのバウンディングボックス内でドラッグされたアイテムを解放します。システムは、ViewオブジェクトのリスナーにアクションタイプACTION_DROPのドラッグイベントを送信します。

  • Ended −アクションタイプACTION_DROPの直後に、システムはアクションタイプACTION_DRAG_ENDEDのドラッグイベントを送信して、ドラッグ操作が終了したことを示します。

DragEventクラス

ザ・ DragEventドラッグアンドドロップ操作中のさまざまな時点でシステムによって送信されるイベントを表します。このクラスは、ドラッグアンドドロッププロセス中に使用するいくつかの定数と重要なメソッドを提供します。

定数

以下は、DragEventクラスの一部として使用可能なすべての定数整数です。

シニア番号 定数と説明
1

ACTION_DRAG_STARTED

ドラッグアンドドロップ操作の開始を通知します。

2

ACTION_DRAG_ENTERED

ドラッグポイントがビューの境界ボックスに入ったことをビューに通知します。

3

ACTION_DRAG_LOCATION

ドラッグシャドウがまだビューオブジェクトの境界ボックス内にある場合は、ACTION_DRAG_ENTEREDの後にビューに送信されます。

4

ACTION_DRAG_EXITED

ユーザーがドラッグシャドウをビューのバウンディングボックスの外に移動したことを通知します。

5

ACTION_DROP

ユーザーがドラッグシャドウを解放し、ドラッグポイントがビューの境界ボックス内にあることをビューに通知します。

6

ACTION_DRAG_ENDED

ドラッグアンドドロップ操作が終了したことをビューに通知します。

メソッド

以下は、DragEventクラスの一部として利用できるいくつかの重要で最も頻繁に使用されるメソッドです。

シニア番号 定数と説明
1

int getAction()

このイベントのアクション値を調べます。

2

ClipData getClipData()

startDrag()の呼び出しの一部としてシステムに送信されたClipDataオブジェクトを返します。

3

ClipDescription getClipDescription()

ClipDataに含まれているClipDescriptionオブジェクトを返します。

4

boolean getResult()

ドラッグアンドドロップ操作の結果の表示を返します。

5

float getX()

ドラッグポイントのX座標を取得します。

6

float getY()

ドラッグポイントのY座標を取得します。

7

String toString()

このDragEventオブジェクトの文字列表現を返します。

ドラッグイベントをリッスンしています

レイアウト内のビューのいずれかがドラッグイベントに応答する必要がある場合、ビューはいずれかを実装します View.OnDragListener またはセットアップ onDragEvent(DragEvent)コールバックメソッド。システムがメソッドまたはリスナーを呼び出すと、上記で説明したDragEventオブジェクトが渡されます。Viewオブジェクトのリスナーメソッドとコールバックメソッドの両方を持つことができます。これが発生した場合、システムは最初にリスナーを呼び出し、次にリスナーがtrueを返す限りコールバックを定義します。

組み合わせonDragEvent(いるDragEvent)メソッドとView.OnDragListenerは、の組み合わせに類似していますonTouchEvent() そして View.OnTouchListener 古いバージョンのAndroidのタッチイベントで使用されます。

ドラッグイベントの開始

あなたは作成することから始めます ClipData そして ClipData.Item移動するデータの場合。ClipDataオブジェクトの一部として、に保存されているメタデータを提供します。ClipDescriptionClipData内のオブジェクト。データの移動を表さないドラッグアンドドロップ操作の場合は、null 実際のオブジェクトの代わりに。

次に、拡張することができます View.DragShadowBuilderビューをドラッグするためのドラッグシャドウを作成するか、View.DragShadowBuilder(View)を使用して、渡されたView引数と同じサイズのデフォルトのドラッグシャドウを作成し、タッチポイントをドラッグシャドウの中央に配置します。

次の例は、を使用した単純なドラッグアンドドロップの機能を示しています。 View.setOnLongClickListener() View.setOnTouchListener()そして View.OnDragEventListener()

ステップ 説明
1 あなたは、Androidアプリケーションを作成するには、AndroidスタジオIDEを使用して、それを名前を付けます私のアプリケーションパッケージの下com.example.saira_000.myapplication
2 src / MainActivity.javaファイルを変更し、イベントリスナーを定義するコードと、例で使用されているロゴ画像のコールバックメソッドを追加します。
3 画像abc.pngをres / drawable- *フォルダーにコピーします。さまざまなデバイスに画像を提供する場合は、さまざまな解像度の画像を使用できます。
4 レイアウトXMLファイルres / layout / activity_main.xmlを変更して、ロゴ画像のデフォルトビューを定義します。
5 アプリケーションを実行してAndroidエミュレーターを起動し、アプリケーションで行われた変更の結果を確認します。

変更されたメインアクティビティファイルの内容は次のとおりです src/MainActivity.java。このファイルには、基本的なライフサイクルメソッドのそれぞれを含めることができます。

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

以下の内容になります res/layout/activity_main.xml ファイル-

次のコードでは、abcは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>

以下の内容になります res/values/strings.xml 2つの新しい定数を定義する-

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

以下はのデフォルトコンテンツです 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>

あなたを実行してみましょう My Application応用。私はあなたがあなたを作成したと思いますAVD環境設定をしながら。Android Studioからアプリを実行するには、プロジェクトのアクティビティファイルの1つを開き

、ツールバーの[実行]アイコンをクリックします。Android StudioはアプリをAVDにインストールして起動し、セットアップとアプリケーションに問題がなければ、次のエミュレーターウィンドウが表示されます-

表示されたTutorialsPointロゴをロングクリックすると、ロゴ画像がその場所から1秒ロングクリックした後、少し移動することがわかります。これは、画像のドラッグを開始する時間です。画面上でドラッグして、新しい場所にドロップできます。