Skip to content
navigation

Drag and Drop

За допомогою фреймворка 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, чий слухач не зареєстрований, або якщо користувач вивільняє вивільняє тінь перетягування надь будь-чим, що не є частиною поточного розташування.

Слухач, як очікується, повертатиме логічне true, якщо він успішно повертає скидання. Інакше він повинен повертати false.

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(). Використовуйте його для надсилання системі розмірів та точки торкання тіні перетаскування. Метод має два аргументи:
dimensions
Об'єкт Point. Ширина тіні перетасакування іде в  x, та висота іде в y.
touch_point
Об'єкт Point. Точка торкання є локацією на тіні перетаскування, що повинна бути під пальцем користувача під час перетаскування. Його позиція X іде в x, та його позиція Y іде в y
onDrawShadow()
Безпосередньо після виклику до onProvideShadowMetrics() система викликає onDrawShadow() щоб отримати саму тінь перетаскування. Цей метод має єдиний аргумент, об'єкт Canvas, що конструює система з параметрів, які ви запровадили в onProvideShadowMetrics(). Використовуйте це для малювання тіні перетаскування в запровадженому об'єкті Canvas.

Щоб покращити продуктівність вам треба утримувати розмір тіні перетаскування малою. Для єдиного елементу ви можете побажати використаті іконку. Для мульти-вибору ви можете використати іконки стопкою, скоріше, ніж це будуть повні зображення, що розкидані по всьому екрану. 

Розробка операції перетаскування


Цей розділ показує крок за кроком, як почати перетаскування, як відповідати на події під час перетаскування, як відповідати на подію скидання, та як завершити операцію перетягування.

Початок перетягування

Користувач починає з жесту перетягування, звичайно - довгого торкання, на об'єкті View. У відповідь ви повинні зробити наступне:

  1. Як потрібно, створити 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)
               
    );

       
    }
    }
  2. Наступний шматок коду визначає 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 слухач повинен зробити наступне:

  1. Викличте getClipDescription() для отримання ClipDescription. Використовуйте методи MIME типу в ClipDescription, щоб побачити, чи слухач може прийняти дані, що будуть перетаскуватись.

    Якщо операція перетаскуваня не відповідає переміщенню даних, це може не знадобитись.

  2. Якщо слухач може приймати скидання, вона повинна повернути true. Це каже системі продовжує надсилати події перетаскування слухачеві. Якщо він не може сприйняти скидання, він має повернути false, та система скінчить надсилання подій перетаскування, доки не надійде повідомлення ACTION_DRAG_ENDED.

Зауважте, що для події ACTION_DRAG_STARTED наступні методи DragEvent невалідні: getClipData(), getX(), getY(), та getResult().

Обробка подій під час перетаскування

Під час перетягування слухачі, що що повернули true у відповідь на подію перетаскування ACTION_DRAG_STARTED, продовжують отримувати події перетаскування. Типи подій перетаскування, які отримує слухач під час перетаскування, залежить від роложення тіні перетаскування, та видимість View-слухачів.

Під час перетягування слухачі в основному використовують події перетаскування, щоб вирішити, чи вони повинні змінювати зовнішній вигляд своїх View.

Під час перетягування getAction() повертає три значення:

Слухач не потребує реагувати на жодне з ціх типів подій. Якщо слухач повертає значення до системи, воно буде проігноровано. Далі ідуть деякі настанови щодо реакції на кожний з ціх типів подій:

Відповідь на скидання

Коли користувач скидає тінь перетаскування на View в застосуванні, та цей View попередньо доповів, що він може сприймати вміст, що був переміщений, система диспечеризує подію скидання на цей View з типом дії ACTION_DROP. Слухач повинен зробити наступне:

  1. Викликати getClipData() щоб отримати об'єкт ClipData, що був зпочатку наданий в виклику до startDrag(), та зберегти його. Якщо операція перетаскування не представляє переміщення даних, це може бути непотрібним.
  2. Повернути логічне 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. Це вказує, що операцію перетаскування скінчено. 

Кожний слухач повинен зробити наступне:

  1. Якщо слухач змінює вигляд свого View під час операції, він повинен скинути View в стан по замовчанню. Це буде візуальною вказівкою користувачеві, що операцію скінчено.
  2. Слухач може опціонально викликати getResult(), щоб дізнатись щось про операцію. Якщо слухач повернув true у відповідь на поідю з типом дії ACTION_DROP, тоді getResult() буде повертати логічне true. В інших випадках getResult() повертає логічне false, включаючи любі випадки, коли система не надсилала назовні подію ACTION_DROP.
  3. Слухач повінен повернути логічне 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;
   
}
};
This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in English?

You requested a page in English, but your language preference for this site is English.

Would you like to change your language preference and browse this site in English? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)