Учебники

Android — перетаскивание

Платформа перетаскивания Android позволяет пользователям перемещать данные из одного представления в другое представление в текущем макете с помощью графического жеста перетаскивания. Начиная с API 11 поддерживается перетаскивание вида на другие виды или группы видов. Структура включает в себя следующие три важных компонента для поддержки функции перетаскивания —

  • Перетащите класс событий .

  • Перетащите слушателей .

  • Вспомогательные методы и занятия .

Перетащите класс событий .

Перетащите слушателей .

Вспомогательные методы и занятия .

Процесс перетаскивания

Есть в основном четыре шага или состояния в процессе перетаскивания —

  • Начато — это событие возникает, когда вы начинаете перетаскивать элемент в макете, ваше приложение вызывает метод startDrag (), чтобы сообщить системе о необходимости перетаскивания. Аргументы внутри метода startDrag () предоставляют данные для перетаскивания, метаданные для этих данных и обратный вызов для рисования тени перетаскивания.

    Система сначала отвечает, перезванивая вашему приложению, чтобы получить тень. Затем он отображает тень на устройстве.

    Затем система отправляет событие перетаскивания с типом действия ACTION_DRAG_STARTED зарегистрированным прослушивателям событий перетаскивания для всех объектов View в текущем макете.

    Чтобы продолжать получать события перетаскивания, включая возможное событие перетаскивания, прослушиватель события перетаскивания должен возвращать значение true. Если прослушиватель события перетаскивания возвращает значение false, то он не будет получать события перетаскивания для текущей операции, пока система не отправит событие перетаскивания с типом действия ACTION_DRAG_ENDED.

  • Продолжение — пользователь продолжает перетаскивание. Система отправляет действие ACTION_DRAG_ENTERED, за которым следует действие ACTION_DRAG_LOCATION, зарегистрированному слушателю события перетаскивания для представления, в которое входит точка перетаскивания. Слушатель может изменить внешний вид своего объекта View в ответ на событие или может отреагировать, выделив его View.

    Слушатель события перетаскивания получает действие ACTION_DRAG_EXITED после того, как пользователь переместил тень перетаскивания за ограничивающую рамку вида.

  • Отброшенный — пользователь освобождает перетаскиваемый элемент в ограничивающей рамке представления. Система отправляет слушателю объекта View событие перетаскивания с типом действия ACTION_DROP.

  • Завершено — сразу после типа действия ACTION_DROP система отправляет событие перетаскивания с типом действия ACTION_DRAG_ENDED, чтобы указать, что операция перетаскивания завершена.

Начато — это событие возникает, когда вы начинаете перетаскивать элемент в макете, ваше приложение вызывает метод startDrag (), чтобы сообщить системе о необходимости перетаскивания. Аргументы внутри метода startDrag () предоставляют данные для перетаскивания, метаданные для этих данных и обратный вызов для рисования тени перетаскивания.

Система сначала отвечает, перезванивая вашему приложению, чтобы получить тень. Затем он отображает тень на устройстве.

Затем система отправляет событие перетаскивания с типом действия ACTION_DRAG_STARTED зарегистрированным прослушивателям событий перетаскивания для всех объектов View в текущем макете.

Чтобы продолжать получать события перетаскивания, включая возможное событие перетаскивания, прослушиватель события перетаскивания должен возвращать значение true. Если прослушиватель события перетаскивания возвращает значение false, то он не будет получать события перетаскивания для текущей операции, пока система не отправит событие перетаскивания с типом действия ACTION_DRAG_ENDED.

Продолжение — пользователь продолжает перетаскивание. Система отправляет действие ACTION_DRAG_ENTERED, за которым следует действие ACTION_DRAG_LOCATION, зарегистрированному слушателю события перетаскивания для представления, в которое входит точка перетаскивания. Слушатель может изменить внешний вид своего объекта View в ответ на событие или может отреагировать, выделив его View.

Слушатель события перетаскивания получает действие ACTION_DRAG_EXITED после того, как пользователь переместил тень перетаскивания за ограничивающую рамку вида.

Отброшенный — пользователь освобождает перетаскиваемый элемент в ограничивающей рамке представления. Система отправляет слушателю объекта View событие перетаскивания с типом действия ACTION_DROP.

Завершено — сразу после типа действия ACTION_DROP система отправляет событие перетаскивания с типом действия ACTION_DRAG_ENDED, чтобы указать, что операция перетаскивания завершена.

Класс DragEvent

DragEvent представляет событие, которое система отправляет в разное время во время операции перетаскивания. Этот класс предоставляет несколько констант и важных методов, которые мы используем во время процесса перетаскивания.

Константы

Ниже приведены все целые числа констант, доступные как часть класса DragEvent.

Sr.No. Константы и описание
1

ACTION_DRAG_STARTED

Сигнализирует о начале операции перетаскивания.

2

ACTION_DRAG_ENTERED

Сигналы к View, что точка перетаскивания вошла в ограничивающую рамку View.

3

ACTION_DRAG_LOCATION

Отправляется в View после ACTION_DRAG_ENTERED, если тень перетаскивания все еще находится в ограничивающем поле View.

4

ACTION_DRAG_EXITED

Сигналы о том, что пользователь переместил тень перетаскивания за ограничивающую рамку вида.

5

ACTION_DROP

Сигналы к представлению, что пользователь выпустил тень перетаскивания, и точка перетаскивания находится внутри ограничительной рамки вида.

6

ACTION_DRAG_ENDED

Сигналы к просмотру, что операция перетаскивания завершена.

ACTION_DRAG_STARTED

Сигнализирует о начале операции перетаскивания.

ACTION_DRAG_ENTERED

Сигналы к View, что точка перетаскивания вошла в ограничивающую рамку View.

ACTION_DRAG_LOCATION

Отправляется в View после ACTION_DRAG_ENTERED, если тень перетаскивания все еще находится в ограничивающем поле View.

ACTION_DRAG_EXITED

Сигналы о том, что пользователь переместил тень перетаскивания за ограничивающую рамку вида.

ACTION_DROP

Сигналы к представлению, что пользователь выпустил тень перетаскивания, и точка перетаскивания находится внутри ограничительной рамки вида.

ACTION_DRAG_ENDED

Сигналы к просмотру, что операция перетаскивания завершена.

методы

Ниже приведены несколько важных и наиболее часто используемых методов, доступных как часть класса DragEvent.

Sr.No. Константы и описание
1

int getAction ()

Проверьте значение действия этого события.

2

ClipData getClipData ()

Возвращает объект ClipData, отправленный в систему как часть вызова startDrag ().

3

ClipDescription getClipDescription ()

Возвращает объект ClipDescription, содержащийся в ClipData.

4

логическое getResult ()

Возвращает указание результата операции перетаскивания.

5

float getX ()

Получает координату X точки перетаскивания.

6

float getY ()

Получает координату Y точки перетаскивания.

7

Строка toString ()

Возвращает строковое представление этого объекта DragEvent.

int getAction ()

Проверьте значение действия этого события.

ClipData getClipData ()

Возвращает объект ClipData, отправленный в систему как часть вызова startDrag ().

ClipDescription getClipDescription ()

Возвращает объект ClipDescription, содержащийся в ClipData.

логическое getResult ()

Возвращает указание результата операции перетаскивания.

float getX ()

Получает координату X точки перетаскивания.

float getY ()

Получает координату Y точки перетаскивания.

Строка toString ()

Возвращает строковое представление этого объекта DragEvent.

Прослушивание Drag Event

Если вы хотите, чтобы любое из ваших представлений в макете отвечало на событие перетаскивания, тогда ваше представление либо реализует метод обратного вызова View.OnDragListener, либо настроил onDragEvent (DragEvent) . Когда система вызывает метод или прослушиватель, она передает им объект DragEvent, описанный выше. Вы можете иметь как слушатель, так и метод обратного вызова для объекта View. Если это происходит, система сначала вызывает слушателя, а затем определяет обратный вызов, пока слушатель возвращает истину.

Комбинация метода onDragEvent (DragEvent) и View.OnDragListener аналогична комбинации onTouchEvent () и View.OnTouchListener, используемой с событиями касания в старых версиях Android.

Начало Drag Event

Вы начинаете с создания ClipData и ClipData.Item для перемещаемых данных. Как часть объекта ClipData , предоставьте метаданные, которые хранятся в объекте ClipDescription в ClipData. Для операции перетаскивания, которая не представляет перемещение данных, вы можете использовать null вместо реального объекта.

Затем вы можете либо расширить расширение View.DragShadowBuilder, чтобы создать тень перетаскивания для перетаскивания представления, либо просто использовать View.DragShadowBuilder (View), чтобы создать тень перетаскивания по умолчанию того же размера, что и передаваемый ей аргумент View, с помощью касания. точка центрирована в тени.

пример

В следующем примере показана функциональность простого перетаскивания с использованием View.setOnLongClickListener () , View.setOnTouchListener () и View.OnDragEventListener () .

шаг Описание
1 Вы будете использовать IDE Android Studio для создания приложения Android и назовите его « Мое приложение» в пакете 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 для определения двух новых констант:

<?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, откройте один из файлов деятельности вашего проекта и нажмите «Выполнить». Eclipse Run Icon значок с панели инструментов. Android-студия устанавливает приложение на AVD и запускает его, и, если все в порядке с настройками и приложением, оно отобразится в следующем окне эмулятора —

Android Drag and Drop

Теперь сделайте длинный щелчок по отображаемому логотипу TutorialsPoint, и вы увидите, что изображение логотипа перемещается немного спустя 1 секунду, щелкнув мышью со своего места, время, когда вы должны начать перетаскивать изображение. Вы можете перетащить его по экрану и оставить на новом месте.