Швидкий погляд
- Дозволяє користувачам пересувати дані в вашому розташуванні Activity, використовуючі графічні жести.
- Підтримує операції за межами пересувань даних.
- Робить тільки в одному застосуванні.
- Потребує API 11.
В цьому документі
Key classes
Пов'язані приклади
Також дивіться
За допомогою фреймворка Android drag/drop ви можете дозволити вашим користувачам переміщувати дані від одного View до іншого, використовуючи графічний жест потягнути-і-кинути (drag and drop). Фреймворк включає клас події перетягування, слухачі перетягування, та допоміжні методи та класи.
Хоча фреймворк зпершу був розроблений для перетягування даних, ви можете використовувати його для інших дій UI. Наприклад, ви можете створити застосування, що міксує кольори, коли користувач пересуває іконку кольлору над іншою іконкою. Залишок цієї статті, однак, описує фреймворк в термінах перетягування даних.
Огляд
Операція drag and drop (далі просто перетягування, прим.
перекл.) починається, коли користувач робить деякий жест, що може бути
розпізнаний як початок перетягування даних. У відповідь ваше
застосування каже системі, що починаєтсья перетягування. Система
робить зворотній виклик до вашого застосування, щоб отримати
представлення даних, що будуть переміщені. По мірі того, як палець
користувача рухає цю репрезентацію ("тінь перетягування") над поточним
розташуванням, система подає події перетягування до об'єкта-слухача
таких подій, та методи зворотнього виклику, асоційовані з об'єктами View
в розташуванні. Як тільки користувач відпускає тінь перетягування,
система завершує операцію перетягування.
Ви створюєте об'єкт слухача подій ("слухачі") від класу, що реалізує
View.OnDragListener
.
Ви встановлюєте об'єкт слухача подій перетягування для View за
допомогою метода об'єкта View setOnDragListener()
.
Кожний об'єкт View також має метод зворотнього виклику onDragEvent()
.
Обоє з них описані більш детально в розділі Слухач
подій перетягування та метод зворотнього виклику.
Зауваження: Для цілей спрощення наступні розділи посилаються на процедуру, що отримує події як на "слухач подій перетягування", навіть якщо це насправді може бути метод зворотнього виклику.
Коли ви починаєте перетягування, ви включаєте обоє, дані, що ви переміщуєте, та метадані, що описують ці дані, як частину виклику до системи. Під час перетягування система надсилає події перетягування до слухачів ціх подій, або методів зворотнього виклику для кожного View в розташуванні. Слухачі або методи зворотнього виклику можуть використовувати метадані для прийняття рішення, чи вони бажають сприйняти дані, якщо вони будуть скинуті. Якщо користувач скидає дані над об'єктом View, та цей View має слухача або метод зворотнього виклику попередньо повідомив систему, що бажає прийняти скидання даних на себе, тоді система надсилає дані до слухача або метод зворотнього виклику в події скадання.
Ваше застосування каже системі розпочати перетягування через виклик
методу startDrag()
.
Це наказує системі почати надсилати події перетягування. Метод також
надсилає дані, які ви перетягуєте.
Ви можете викликати startDrag()
для кожного приєднаного View поточного розташування. Система тільки
використовує об'єкт View для доступу до глобальних налаштувань в
вашому розташуванні.
Коли ваше застосування викликало startDrag()
,
залишок процесу використовує події, які система надсилає до об'єктів
View в вашому поточному розташуванні.
Зауваження: Якщо застосування робить в мульти-віконному режимі, користувачі можуть перетягувати та скидати дані від одного застосування до іншого. За додатковою інформацією дивіться Підтримка переSupporting drag and drop.
Процес перетягування
Загалом є чотири кроки або стани в процесі перетягування:
- Розпочато
- У відповідь на жест користувача на початок перетягування, ваше
застосування викликає
startDrag()
, щоб наказати розпочати перетягування. АргументиstartDrag()
провадять дані, що будуть перетягнуті, метадані для ціх даних, та зворотній виклик для малювання тіні перетягування.Система з початку відповість зворотнім викликом до вашого застосування, щоб отримати тінь перетягування. Потім вона відтворює тінь перетягування на пристрої.
-
Далі система надсилає подію перетаскування з типом дії
ACTION_DRAG_STARTED
до слухачів подій перетаскування для всіх об'єктів View в поточному разташуванні. Щоб продовжити отримувати події перетаскування, включачи можливу подію скидання, слухач подій перетаскування повинен повертатиtrue
. Це реєструє слухача в системі. Тільки зареєстровані слухачі продовжують отримувати події перетаскування. На цей момент слухачі також можуть змінити вигляд своїх об'єктів View, щоб показати, що слухач може приймати подію скидання.Якщо слухач подій повертає
false
, тоді він не буде отримувати для поточної операції, доки система не не надішле подію з типом діїACTION_DRAG_ENDED
. Надсилаючиfalse
, слухач каже системі, що він не зацікавлений в операції перетаскування, та не бажає сприймати перетасквані дані. - Продовження
- Користувач продовжує перетаскування. По мірі того, як тінь
перетаскування перетинається з оточуючим блоком об'єкту View,
система надсилає один або більше подій перетаскування об'єктам View
через слухачів подій перетаскування (якщо вони зареєстровані для
отримання подій). Слухач може обрати змінити вигляд свого об'єкту
View у відповідь на цю подію. Наприклад, якщо подія вказує, що тінь
перетаскування перетнула оточуючий блок View (тип дії
ACTION_DRAG_ENTERED
), слухач може реагувати через підсвічення свого View. - Скидання
- Користувач відпускає тінь перетаскування в межах блоку деякого
View. що може сприймати дані. Система надсилає до слухача подій
перетаскування об'єкту View з типом дії
ACTION_DROP
. Подія перетаскування містить дані, що були передані до системи під час викликуstartDrag()
, що розпочав операцію. Слухач, як очікується, повертає логічнеtrue
до системи, якщо код для сприяння перетягуванню був успішний.Зауважте, що якщо цей крок трапляється тільки в випадку, якщо користувач скидає тінь перетаскування в межах оточуючого блока View, чий слухач зареєструвався для отримання подій перетягування. Якщо користувач вивільнить тінь перетаскування в любій іншій ситуації, подію перетаскування
ACTION_DROP
не буде надіслано нікому. - Завершення
- Після того, як користувач вівільнить тінь перетаскування, та
після того, як система надішле (якщо необхідно) подію перетаскування
з типом дії
ACTION_DROP
, система надсилає подію перетаскування з типом акціїACTION_DRAG_ENDED
, щоб повідомити, що операцію перетаскування завершено. Це робиться незалежно від того, де користувач скинув тінь перетаскування. Подія надсилається до кожного слухача, що зареєстрований для приймання подій перетаскування, навіть якщо слухач отримав подіюACTION_DROP
.
Кожний з ціх чотирьох кроків описаний в розділі Розробка операції перетягування.
Слухач події перетягування та метод зворотнього виклику
View отримує події перетаскування за допомогою або слухача подій
перетаскування, або реалізуючи View.OnDragListener
,
або за допомогою метода зворотнього виклику onDragEvent(DragEvent)
.
Коли система викликає метод або слухач, він передає їм об'єкт DragEvent
.
Скоріше всього ви будете використовувати слухачів в більшості
випадків. Коли ви плануєте UI, звичано ви не створюєте субкласи класів
View, але використання методу зворотнього виклику змушує вас робити
це, щоб перекрити метод. Для порівняння, ви можете реалізувати один
клас слухача, та потім використовувати його для декількох різних
об'єктів View. Також ви можете реалізувати його як анонімний
внутрішній клас. Щоб встановити слухача для об'єкту View викличте setOnDragListener()
.
Ви можете мати одночасно слухача та метод зворотнього виклику для
одного об'єкту View. Якщо це трапляється, система зпочатку викликає
слухача. Система не викликатиме метод зворотнього виклику, якщо слухач
поверне false
.
Комбінація метода onDragEvent(DragEvent)
та View.OnDragListener
аналогічна до комбінації onTouchEvent()
та View.OnTouchListener
,
що використовуються для подій дотиків.
Події перетаскування
Система надсилає подію перетаскування в формі об'єкта DragEvent
.
Об'єкт містить тип дії, що каже слухачеві, що трапилось в процесі
перетаскування. Об'єкт містить інші дані, в залежності від типу дії.
Щоб отримати тип дії, слухач викликає getAction()
.
Існують шість можливих значень, визначених як константи в класі DragEvent
.
Вони перелічені в таблиці 1.
Об'єкт DragEvent
також містить дані, що ваше застосування провадить до системи в
виклику startDrag()
.
Деякі дані валідні тільки для деяких типів дій. Дані, що є валідними
для кожного типу дій, підсумовані в таблиці 2.
Вони також описані в деталях з подіями, для яких воні валідні, в
розділі Розробка операції
перетаскування.
Таблиця 1. Типи дій DragEvent
значення getAction() | Значення |
---|---|
ACTION_DRAG_STARTED |
Слухач подій перетаскування об'єкта View отримує цей тип
подій зразу після того, як застосування викликає startDrag()
та отримає тінь перетаскування. |
ACTION_DRAG_ENTERED |
Слухач подій перетаскування об'єкта View отримує цей тип
подій, коли тінь перетаскування тільки но перетинає оточуючий
блок View. Це перша подія, що отримує слухач, коли тінь
перетаскування перетинає оточуючий блок. Якщо слухач бажає
продовжувати отримувати події перетаскування, він має повернути
логічне true до системи. |
ACTION_DRAG_LOCATION |
Слухач подій перетаскування об'єкта View отримує цей тип
подій після того, як він отримає подію ACTION_DRAG_ENTERED ,
та доки тінь перетаскування все ще в оточуючому блоці View. |
ACTION_DRAG_EXITED |
Слухач подій перетаскування об'єкта View отримує цей тип
подій після того, що він отримає ACTION_DRAG_ENTERED
та щонайменш одну подію ACTION_DRAG_LOCATION ,
та після цього користувач перемістив тінь перетаскування за межі
оточуючого блоку View. |
ACTION_DROP |
Слухач подій перетаскування об'єкта View отримує цей тип
подій, коли користувач вивільняє тінь перетаскування над
об'єктом View. Цей тип дії надсилається до слухача об'єкту
тільки якщо цей слухач повернув логічне true у
відповідь на подію ACTION_DRAG_STARTED .
Цей тип дії не надсилається, якщо користувач тінь перетаскування
над View, чий слухач не зареєстрований, або якщо користувач
вивільняє вивільняє тінь перетягування надь будь-чим, що не є
частиною поточного розташування. Слухач, як очікується, повертатиме логічне |
ACTION_DRAG_ENDED |
Слухач подій перетаскування об'єкта View отримує цей тип
подій, коли система завершує операцію перетаскування. Цей тип
дій не обов'язково слідує за подією ACTION_DROP .
Якщо система надсилає ACTION_DROP ,
отримання типу дії ACTION_DRAG_ENDED
не обов'язково означає, що операція скидання була успішною.
Слухач має викликати getResult()
для отримання значення, що було повернене у відповідь на ACTION_DROP .
Якщо подія ACTION_DROP
не була надіслана, тоді getResult() повертатиме
false . |
Таблиця 2. Валідні дані DragEvent по типам дій
getAction()
значення |
getClipDescription()
значення |
getLocalState()
значення |
getX()
значення |
getY()
значення |
getClipData()
значення |
getResult()
значення |
---|---|---|---|---|---|---|
ACTION_DRAG_STARTED |
X | X | X | |||
ACTION_DRAG_ENTERED |
X | X | X | X | ||
ACTION_DRAG_LOCATION |
X | X | X | X | ||
ACTION_DRAG_EXITED |
X | X | ||||
ACTION_DROP |
X | X | X | X | X | |
ACTION_DRAG_ENDED |
X | X | X |
Методи getAction()
,
describeContents()
,
writeToParcel()
,
та toString()
завжди повертають валідні дані.
Якщо метод не містить валідних даних для певного типу дії, він
повератє або null
, або 0, в залежності від типу
результата.
Тінь перетаскування
Впродовж операції перетаскування система відображує зображення, саме яке і пересувая користувач. Для переміщення даних це зображення представляє дані, що будуть перетягуватись. Для інших операцій зображення представляє деякий аспект операції перетаскування.
Зображення має назву тіні перетягування. Ви створюєте його за
допомогою методів, що ви визначаєте для View.DragShadowBuilder
об'єкта, та поітм передається в систему, коли ви починаєте
перетягування, використовуючи startDrag()
.
Як частина його відповіді на startDrag()
система викликає метод зворотнього виклику, що ви визначили в View.DragShadowBuilder
,
щоб отримати тінь перетаскування.
Клас View.DragShadowBuilder
має два конструктори:
View.DragShadowBuilder(View)
- Цей конструктор сприймає любий з об'єктів
View
вашого застосування. Конструктор зберігає цей об'єкт в об'єктіView.DragShadowBuilder
, так що під час зворотнього виклику ви можете отримати доступ до нього, щоб побудувати вашу тінь перетаскування. Він не повинен бути асоційованим з View (якщо такий взагалі є), що обирає користувач для початку операції перетаскування.Якщо ви використовуєте цей констрктор, ви не повинні розширяти
View.DragShadowBuilder
, або перекривати його методи. По замовчанню, ви будете отримувати тінь перетаскування, що має той самий вигляд, що і View, що ви передаєте як аргумент, відцентрований відносно локації, де користувач дотикається до екрана. View.DragShadowBuilder()
- Якщо ви використовуєте цей конструктор, об'єкт View не є
доступним в об'єкті
View.DragShadowBuilder
(поле встановлене вnull
). Якщо ви використовуєте цей конструктор, та не розширюєтеView.DragShadowBuilder
або перекриваєте його методи, ви будете отримувати невидиму тінь перетаскування. Система не видаватиме помилку.
Клас View.DragShadowBuilder
має два методи:
-
onProvideShadowMetrics()
- Система викликає цей метод безпосередньо після того, як ви
викличете
startDrag()
. Використовуйте його для надсилання системі розмірів та точки торкання тіні перетаскування. Метод має два аргументи: -
onDrawShadow()
- Безпосередньо після виклику до
onProvideShadowMetrics()
система викликаєonDrawShadow()
щоб отримати саму тінь перетаскування. Цей метод має єдиний аргумент, об'єктCanvas
, що конструює система з параметрів, які ви запровадили вonProvideShadowMetrics()
. Використовуйте це для малювання тіні перетаскування в запровадженому об'єктіCanvas
.
Щоб покращити продуктівність вам треба утримувати розмір тіні перетаскування малою. Для єдиного елементу ви можете побажати використаті іконку. Для мульти-вибору ви можете використати іконки стопкою, скоріше, ніж це будуть повні зображення, що розкидані по всьому екрану.
Розробка операції перетаскування
Цей розділ показує крок за кроком, як почати перетаскування, як відповідати на події під час перетаскування, як відповідати на подію скидання, та як завершити операцію перетягування.
Початок перетягування
Користувач починає з жесту перетягування, звичайно - довгого торкання, на об'єкті View. У відповідь ви повинні зробити наступне:
- Як потрібно, створити
ClipData
таClipData.Item
для даних, що мають бути переміщені. Як частина об'єкту ClipData, надати метадані, що зберігаютсья в об'єктіClipDescription
в ClipData. для операції перетаскування, що не представляє переміщення даних, ви можете побажати використатиnull
замість справжнього об'єкту.Наприклад, цей шматок коду показує, як відповідати на довге торкання на ImageView через створення об'єкту ClipData, що містить тег або мітку ImageView. Слідуя цьому фрагменту, наступний фрагмент показує, як перекрити методи в
View.DragShadowBuilder
:// Створюємо рядок для міткиImageView
private static final String IMAGEVIEW_TAG = "icon bitmap"
// Створюємо новий ImageView
ImageView imageView = new ImageView(this);
// Встановлюємо бітову мапу для ImageView з бітової мапи іконки (визначена деінде)
imageView.setImageBitmap(mIconBitmap);
// Встановлюємо тег
imageView.setTag(IMAGEVIEW_TAG);
...
// Встановлюємо слухача довгого торкання для ImageView, використовуючи анонісного слухача,
// що реалізує інтерфейс OnLongClickListener
imageView.setOnLongClickListener(new View.OnLongClickListener() {
// Визначає єдиний метод цього інтерфейсу, що викликається, коли на View робиться довге торкання
public boolean onLongClick(View v) {
// Створити новий ClipData.
// Це робиться в два кроки щоб надати ясності. Зручний метод ClipData.newPlainText() може створити
// ClipData з текстом в один крок.
// Створити новий ClipData.Item з тегу об'єкта ImageView
ClipData.Item item = new ClipData.Item(v.getTag());
// Створити новий ClipData, використовуючи тег в якості мітки, MIME тип звичайного типу, та вже створений елемент.
// Це створить новий об'єкт ClipDescription в ClipData, та встановить його MIME тип в "text/plain"
ClipData dragData = new ClipData(v.getTag(),ClipData.MIMETYPE_TEXT_PLAIN,item);
// Створює екземпляр побудовника тіні перетаскування.
View.DragShadowBuilder myShadow = new MyDragShadowBuilder(imageView);
// Починає перетягування
v.startDrag(dragData, // дані, що будуть перетягуватись
myShadow, // побудовник тіні перетягування
null, // не треба використовувати локальні дані
0 // флаги (наразі не використовуються, встановлені в 0)
);
}
} - Наступний шматок коду визначає
myDragShadowBuilder
. Він створює тінь для перетаскування TextView в вигляді малого сірого прямокутника:private static class MyDragShadowBuilder extends View.DragShadowBuilder {
// Зображення тіні перетаскування, визначене як drawable
private static Drawable shadow;
// Визначає конструктор для myDragShadowBuilder
public MyDragShadowBuilder(View v) {
// Зберігає параметр View, переданий до myDragShadowBuilder.
super(v);
// Створює зображення для перетаскування, що буде заповнювати Canvas, запроваджений системою.
shadow = new ColorDrawable(Color.LTGRAY);
}
// Визначає зворотній виклик, що надсилає розмірі тіні перетаскування, та точку торкання назад до системи.
@Override
public void onProvideShadowMetrics (Point size, Point touch) {
// Визначає локальні змінні
private int width, height;
// Вказує ширину тіні як половину ширини оригінального View
width = getView().getWidth() / 2;
// Встановлює висоту тіні як половини висоти оригінального View
height = getView().getHeight() / 2;
// Тінь перетаскування є ColorDrawable. Це встановлює його розміри в ті самі, як і в
// Canvas, що буде провадити система. Як результат, тінь перетаскування буде заповнювати Canvas.
shadow.setBounds(0, 0, width, height);
// Встановлює розмір за допомогою двох параметрів, значень ширини та висоти. Вони повертаються до
// системи через параметр розміру.
size.set(width, height);
// Встанволює позицію точки дотику, щоб бути по середині тіні перетаскування
touch.set(width / 2, height / 2);
}
// Визначає зворотній виклик, що малює тінь перетягування на Canvas, яку система конструює
// з розмірів, переданих в onProvideShadowMetrics().
@Override
public void onDrawShadow(Canvas canvas) {
// Draws the ColorDrawable in the Canvas passed in from the system.
shadow.draw(canvas);
}
}Зауваження: Пам'ятайте, що нам не треба розширювати
View.DragShadowBuilder
. КонструкторView.DragShadowBuilder(View)
створює тінь перетаскування по замовчанню, що матиме той самий розмір, що і аргумент View, переданий йому, з точкою дотика посередині тіні перетаскування.
Відповідь на початок перетягування
Під час операції перетягування система диспечеризує події
перетягування до відповідних слухачів об'єктів View в поточному
розташуванні. Слухачі повинні реагувати, викликаючи getAction()
,
щоб отримати тип події. На початаку перетаскування ці методи
повертають ACTION_DRAG_STARTED
.
У відповідь на подію з типом події ACTION_DRAG_STARTED
слухач повинен зробити наступне:
- Викличте
getClipDescription()
для отриманняClipDescription
. Використовуйте методи MIME типу вClipDescription
, щоб побачити, чи слухач може прийняти дані, що будуть перетаскуватись.Якщо операція перетаскуваня не відповідає переміщенню даних, це може не знадобитись.
- Якщо слухач може приймати скидання, вона повинна повернути
true
. Це каже системі продовжує надсилати події перетаскування слухачеві. Якщо він не може сприйняти скидання, він має повернутиfalse
, та система скінчить надсилання подій перетаскування, доки не надійде повідомленняACTION_DRAG_ENDED
.
Зауважте, що для події ACTION_DRAG_STARTED
наступні методи DragEvent
невалідні: getClipData()
,
getX()
,
getY()
,
та getResult()
.
Обробка подій під час перетаскування
Під час перетягування слухачі, що що повернули true
у
відповідь на подію перетаскування ACTION_DRAG_STARTED
,
продовжують отримувати події перетаскування. Типи подій
перетаскування, які отримує слухач під час перетаскування, залежить
від роложення тіні перетаскування, та видимість View-слухачів.
Під час перетягування слухачі в основному використовують події перетаскування, щоб вирішити, чи вони повинні змінювати зовнішній вигляд своїх View.
Під час перетягування getAction()
повертає три значення:
-
ACTION_DRAG_ENTERED
: Слухач отримує його, коли точка торкання (точка екрана під пальцем користувача) перетинає оточуючий прямокутник View слухача. -
ACTION_DRAG_LOCATION
: Коли слухач отримує подіюACTION_DRAG_ENTERED
, та перед тим, як він отримає подіюACTION_DRAG_EXITED
, він отримує нові подіїACTION_DRAG_LOCATION
кожного разу, коли точка торкання змінюється. МетодиgetX()
таgetY()
повертають координати X та Y точки торкання. -
ACTION_DRAG_EXITED
: Ця подія надсилається слухачеві, що попередньо отрималаACTION_DRAG_ENTERED
, після того, як тінь перетаскування більше не в межах оточуючого прямокутника View слухача.
Слухач не потребує реагувати на жодне з ціх типів подій. Якщо слухач повертає значення до системи, воно буде проігноровано. Далі ідуть деякі настанови щодо реакції на кожний з ціх типів подій:
- У відповідь на
ACTION_DRAG_ENTERED
абоACTION_DRAG_LOCATION
, слухач може змінювати вигляд View, щоб вказати, що він готовий отримати скидання. - Подія з типом дії
ACTION_DRAG_LOCATION
містить валідні дані дляgetX()
таgetY()
, відповідно до розміщення точки дотику. Слухач може побажати використати цю інформацію для зміни вигляду частини View, де знаходиться точка дотику. Слухач також може використовувати цю інформацію для визначення точної позиції, де користувач збирається скидати тінь перетягування. - У відповідь на
ACTION_DRAG_EXITED
слухач повинен скинути любі зміни зовнішнього вигляду, що були ним застосовані у відповідь наACTION_DRAG_ENTERED
абоACTION_DRAG_LOCATION
. Це вказує користувачеві, що View більше не є неинучую ціллю скидання.
Відповідь на скидання
Коли користувач скидає тінь перетаскування на View в застосуванні,
та цей View попередньо доповів, що він може сприймати вміст, що був
переміщений, система диспечеризує подію скидання на цей View з типом
дії ACTION_DROP
.
Слухач повинен зробити наступне:
- Викликати
getClipData()
щоб отримати об'єктClipData
, що був зпочатку наданий в виклику доstartDrag()
, та зберегти його. Якщо операція перетаскування не представляє переміщення даних, це може бути непотрібним. - Повернути логічне
true
, щоб вказати, що скидання було оброблене успішно, або логічнеfalse
, якщо ні. Повернуте значення стає значенням, що повертатимеgetResult()
для подіїACTION_DRAG_ENDED
.Зауважте, що якщо система не надсилає подію
ACTION_DROP
, значенняgetResult()
для подіїACTION_DRAG_ENDED
будеfalse
.
Для події ACTION_DROP
getX()
та getY()
повертають координати X та Y точки пересування на момент скидання,
викристовуючи системні координати View, що є отримувачем скидання.
Система дозволяє користувачеві вивільнити тінь перетягування над
View, чий слухач не отримує події перетягування. Він також дозволяє
користувачеві вивільнити тінь перетягування над порожніми регіонами UI
застосування, або над областями за межами застосування. В усіх ціх
випадках система не надсилатиме подію з типом дії ACTION_DROP
,
хоча вона надішле подію ACTION_DRAG_ENDED
.
Відповідь на кінець перетаскування
Безпосередньо після того, як користувач вивільняє тінь
перетаскування, система надсилає подію перетаскування до всіх
відповідних слухачів в ашому застовуванні, з типом дії ACTION_DRAG_ENDED
.
Це вказує, що операцію перетаскування скінчено.
Кожний слухач повинен зробити наступне:
- Якщо слухач змінює вигляд свого View під час операції, він повинен скинути View в стан по замовчанню. Це буде візуальною вказівкою користувачеві, що операцію скінчено.
- Слухач може опціонально викликати
getResult()
, щоб дізнатись щось про операцію. Якщо слухач повернувtrue
у відповідь на поідю з типом діїACTION_DROP
, тодіgetResult()
буде повертати логічнеtrue
. В інших випадкахgetResult()
повертає логічнеfalse
, включаючи любі випадки, коли система не надсилала назовні подіюACTION_DROP
. - Слухач повінен повернути логічне
true
до системи.
Відповідь не події пересування: приклад
Всі події пересування зпочатку надсилаються до вашого метода обробки таких подій, або до слухача. Наступний код є простим прикладом реагування на події перетаскування в слухачі:
// Створює новий слухач подій пересування
mDragListen = new myDragEventListener();
View imageView = new ImageView(this);
// Встановлює слухач подій перетаскування для View
imageView.setOnDragListener(mDragListen);
...
protected class myDragEventListener implements View.OnDragListener {
// Цей метод, який викликає, коли він диспечеризує події перетаскування до слухача
public boolean onDrag(View v, DragEvent event) {
// Визначає змінну для зберігання типу дії для входящої події
final int action = event.getAction();
// Обробляє кожне з очікуваних подій
switch(action) {
case DragEvent.ACTION_DRAG_STARTED:
// Визначає, чи цей View може сприймати перетаскувані дані
if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
// Як приклад того, що може робити застосування, воно застосовує синій колір
// до View, що вказує, що він може сприймати скидання.
v.setColorFilter(Color.BLUE);
// Скидає перегляд, щоб змусити перефарбування в новий колір
v.invalidate();
// повертає true, щоб вказати, що цей View може сприймати перетягнуті дані.
return true;
}
// Повертає false. Під час поточної операції цей View не буде отримувати події,
// доки не буде надісланий ACTION_DRAG_ENDED.
return false;
case DragEvent.ACTION_DRAG_ENTERED:
// Застосовує зелений колір до View. Повертає true; повернуте значення ігнорується.
v.setColorFilter(Color.GREEN);
// Сакидає перегляд, щоб змусити перемалювання новим кольором.
v.invalidate();
return true;
case DragEvent.ACTION_DRAG_LOCATION:
// Ігноруєму цю подію
return true;
case DragEvent.ACTION_DRAG_EXITED:
// Скидає колір до синього. Повертає true; повернуте значення ігноруєтсья.
v.setColorFilter(Color.BLUE);
// Скидає перегляд, щоб змусити перемалювання новим кольором.
v.invalidate();
return true;
case DragEvent.ACTION_DROP:
// Отримує елемент, що містить переміщувані дані.
ClipData.Item item = event.getClipData().getItemAt(0);
// Отримує текстові дані з елементу.
dragData = item.getText();
// Відображує повідомлення, що містить пересунуті дані.
Toast.makeText(this, "Dragged data is " + dragData, Toast.LENGTH_LONG);
// Відключає любі кольори підсвічування
v.clearColorFilter();
// Скидає перегляд щоб змусити до перемалювання
v.invalidate();
// Повертає true. DragEvent.getResult() повертатиме true.
return true;
case DragEvent.ACTION_DRAG_ENDED:
// Відключає любі кольори підсвічування
v.clearColorFilter();
// Скидає перегляд щоб змусити до перемалювання
v.invalidate();
// Отримує getResult(), та відображує що трапилось.
if (event.getResult()) {
Toast.makeText(this, "Скидання оброблене.", Toast.LENGTH_LONG);
} else {
Toast.makeText(this, "Скидання не працює.", Toast.LENGTH_LONG);
}
// повертає true; значення ігнорується.
return true;
// Отримано невідомий тип дії.
default:
Log.e("DragDrop Example","Невідомий тип отриманий OnDragListener.");
break;
}
return false;
}
};