Android перетаскивание view по экрану

Технология Drag and Drop в Android

Недавно у меня появилась идея заняться разработкойигры для андроид. Для начала я решил написать шахматы. Мне казалось технологияDrag and Drop отлично подойдет для реализации механизма перемещения фигур. Для непосвященных отмечу, чтометод drag and drop заключается в возможности перетаскивания одних графических объектов на другие и выполнения того или иного действия после отпускания. Простейший пример — удаление ярлыка с рабочего стола вашего ПК перетаскиванием его в корзину. «Кинув» ярлык в корзину, мы говорим системе, что хотим заставить взаимодействовать эти два объекта. Система получает наш сигнал и решает, какое действие ей стоит предпринять. Drag and drop получила широкое распространение благодаря своей интуитивной ясности. Этот подход подкреплен нашим опытом взаимодействия с объектами реального мира и прекрасно работает в виртуальной среде. Что же касается шахмат, с помощью drag and drop технологически проще определить клетку, куда пользователь перетащил фигуру, поскольку не нужно вычислять номер клетки по координатам точки отпускания. Эту работу возьмет на себя виртуальная машина.

Цели использования технологии Drag n Drop

Использование технологии drag and drop позволяет мне малой кровью решить три задачи:

  1. Визуализация хода. Когда пользователь касается фигуры и начинает ее перемещение по экрану, фигура заменяется более мелким рисунком. Таким образом, пользователь понимает что фигура захвачена.
  2. Я ограничил область перемещения фигуры размерами доски.
  3. Если пользователь отпустил фигуру в неправильном месте, она должна вернуться в первоначальное положение.

Задачи обозначены, приступим к их реализации.

Подмена ImageView при касании

Все мои фигуры представляют собой объекты ImageView. К сожалению, оказалось что реализация Drag & Drop в Android не позволяет «прямо из коробки» осуществлять подмену изображения объекта при его касании. Тем не менее, эта задача вполне решаема средствами API. Нам понадобится выполнить ряд несложных действий:

  1. Создать объект DragShadowBuilder.
  2. Вызвать метод startDrag.
  3. Спрятать наш ImageView, который отображает фигуру, вызвав метод setVisibility с параметром View.INVISIBLE. В результате на экране останется только объект DragShadowBuilder, что будет сигналом пользователю о захвате фигуры.

Эти действия необходимо реализовать в обработчике OnTouchListner объекта ImageView. Для этого переопределим метод onTouch:

Все очень просто. Итак, с подменой изображения разобрались, перейдем к следующей задаче.

Ограничение области перетаскивания для функции drag drop

Ограничение области перетаскивания связано с одной проблемой. Дело в том, что если отпустить фигуру за пределами доски, события drop не случится, поскольку пользователь отпустил объект на пустом месте, и объекту не с чем взаимодействовать. В результате фигура не вернется в свое первоначальное состояние и так и останется навсегда спрятанной. Я убил уйму времени на чтение документации, но так и не нашел способа ограничить область перетаскивания объектов. Озарение пришло внезапно. Мне совсем не нужно ограничивать область, мне нужно узнать правильно ли пользователь отпустил фигуру или нет.

Определение правильности отпускания
Ответы на свои вопросы я нашел в разделе «handling drag end events» на сайте Android Developers. Вот несколько ключевых моментов:

  1. Когда пользователь завершает перетаскивание в обработчике DragListeners генерируется событие ACTION_DRAG_ENDED.
  2. В DragListener можно получить более подробную информацию об операции drag, вызвав метод DragEvent.getResult().
  3. Если DragListener возвращает true в ответ на событие ACTION_DROP, вызов getResult также вернет true, в противном случае — false.

Таким образом, мне нужно перехватить событие ACTION_DRAG_ENDED и вызывать метод getResult. Если он вернет false, значит пользователь утащил фигуру за пределы доски, и мне нужно перевести ImageView в видимый режим.

Читайте также:  Обучение для программирования для android

Теперь пользователь может где угодно отпускать фигуру, и ничего страшного не произойдет.

Определение допустимых ходов

Последняя часть статьи посвящена проверке допустимости хода, который пытается сделать пользователь. Прежде чем подробно приступить к обсуждению этой темы, сделаю небольшую ремарку, объясняющую структуру моего приложения. Шахматная доска представлена как TableLayout, а каждая клетка является потомком LinearLayout и имеет OnDragListener.

Кроме того, каждый OnDragListener ссылается на объект «посредника» (mediator), который заботится о взаимодействии игровых объектов и запоминает положение текущей клетки.

Когда пользователь тащит фигуру над клеткой, возможны следующие действия:

  1. Использование события ACTION_DRAG_ENTERED для установки переменной ‘containsDraggable’ в true.
  2. Использование события ACTION_DRAG_EXITED для установки переменной ‘containsDraggable’ в false.
  3. Использование события ACTION_DROP для запроса посредника о допустимости установки фигуры в эту клетку.

Ниже приведен код, реализующий описанную логику

Как видите, не зависимо от того допустим ли ход или нет, ImageView переводится в видимое состояние. Я хотел, чтобы пользователь видел, как перемещается фигура. Ранее я упоминал, что клетка является потомком LayoutView. Это сделано для того чтобы проще перемещать ImageView от клетки к клетке. Ниже приводится код метода checkForValidMove, который показывает, как происходит перемещение ImageView.

Надеюсь, эта статья поможет Вам при разработке собственных проектов.

Источник

Android перетаскивание view по экрану

В этом уроке мы научимся создавать движение объекта по экрану с полным контролем этого движения прикосновением пальца. У нас на экране будет находится всеми любимое изображение ic_launcher, которое можно будет передвигать по всему экрану в любую точку.

Начнем с создания нового проекта, выбираем Blank Activity, минимальная версия Android будет 2,2+.

Создадим нехитрый интерфейс приложения. Открываем файл activity_main.xml и добавим туда элемент ImageView:

Теперь переходим к написанию самой программы в MainActivity.java. Все происходящее будет вертеться вокруг использования двух вещей — RelativeLayout.LayoutParams и класса MotionEvent. С помощью RelativeLayout.LayoutParams мы запихнем наше изображение в определенные рамки (сделаем его размером 100*100) и будем изменять положение изображения, отслеживая новые координаты положения изображения на экране.

Класс MotionEvent описывает движение с помощью набора значений координат. Он состоит из определенных команд и числовых значений по осям координат, определяющим положение объекта. Например, когда пользователь впервые прикасается к экрану, вызывается команда ACTION_DOWN, а также набор значений X, Y, включающих координаты точки прикосновения.

Из класса MotionEvent у нас будет использовано 2 команды: MotionEvent.ACTION_DOWN — отслеживает факт прикосновения к объекту и начало движения, здесь будут определяться начальные координаты объекта, далее в работу вступает MotionEvent.ACTION_MOVE, в которой происходит динамическое изменение положения объекта за время жеста прикосновения и содержится точка последней остановки, установленная после завершения действия MotionEvent.ACTION_DOWN.

Добавляем в файл MainActivity.java следующий код:

Ну а теперь проверим, работает ли программа, получилось ли желаемое управляемое движение. Запускаем приложение и любуемся результатом:

Наш Андруша успешно двигается по всему экрану, надеюсь у вас также :).

Источник

Находки программиста

Решения конкретных задач программирования. Java, Android, JavaScript, Flex и прочее. Настройка софта под Linux, методики разработки и просто размышления.

воскресенье, 15 июля 2012 г.

Реализация Drag and Drop в Android

Touch-интерфейсы дают нам удивительную возможность «прикоснуться к приложению», манипулировать с элементами на экране самым естественным для человека способом. И нам, разработчикам, грех не использовать такую возможность. Давайте разберёмся, как максимально просто реализовать Drag&Drop в нашем приложении.
В двух словах уточним, какое поведение элемента интерфейса мы хотим получить. Есть пара белых ImageView и один синий прямоугольник. Та из белых картинок, которой мы коснулись будет следовать за пальцем, пока мы её не отпустим. Если мы отпустим её над синим прямоугольником, прямоугольник станет красным, и картинка останется на месте. Если за пределами — картинка вернётся на исходную позицию.
Основная наша цель — сделать всё максимально просто. Кроме Layout-a, описывающего начальное состояние интерфейса, мы напишем всего один класс в сотню строк кода. Итак приступим.

Читайте также:  Open connect to android

Становимся в исходное положение

Как я и описывал в условии задачи: тут синий прямоугольник и две картинки в RelativeLayout-е. Ничего особенного.

Вот и наши 100 строк кода:

Посмотрим на наш код внимательнее. Вся логика реализована тут с помощью двух listener-ов. Первый OnTouchListener, метод onTouch которого реализует непосредственно наше Activity мы навешиваем на «подвижные» картинки. Задача, которую мы тут решаем — определить какая из картинок под пальцем, сохранить её начальные параметры расположения на случай, если нужно будет вернуться и установить флаг начала перемещения.
Второй OnTouchListener вешаем на самый верхний элемент иерархии View нашего Activity. Он определяет координаты «цели», перемещает картинку и проверяет, не попали ли мы уже в цель.

Источник

Android-перемещение ImageView на экране (например, перетаскивание)

я пытаюсь создать приложение, которое может переместить ImageView на вашем устройстве, как перетаскивание, и когда я ставлю как 75% ImageView из экрана показать Toast например. Я читал о MotionEvent и onTouchListener и я следил за этим вопрос, но это меня не убеждает.

редактировать

мой текущий код :

я этих if и else if просто чтобы знать, если ImageView выходит из устройства, на левая и правая сторона устройства кажется, что все в порядке, но я хотел бы сделать его чище и не hardwrited, также я не получаю LayoutParams(150,150) почему 150? Также я не понимаю, почему я должен создать RelativeLayout.LayoutParams а почему я должен поставить

я if/else if потому что я хочу удалить, когда пользователь хочет поставить ImageView из устройства, поэтому мне нужно контролировать, когда он пытается, на данный момент я только получил его сверху / слева / справа не вниз, я также получаю размеры моего устройства только для попробуйте, если X или Y совпадают с высотой или шириной, просто покажите Toast но он делает это неправильно.

теперь мой ImageView — это ic_launcher но он будет больше (почти средний экран).

Примечание

если вы знаете какой-либо другой способ сделать это проще или чище, не стесняйтесь ставить его здесь, я не забочусь о своем коде, я могу адаптировать его, я просто хочу, чтобы он был ясным и не жестко закодирован.

6 ответов

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

этот график объясняет, как вычисляется левое поле. Тот же тип расчета применяется к верхней маржа.

Источник

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

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

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

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

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

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

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

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

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

Читайте также:  App problem android studio

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

Затем система отправляет событие перетаскивания с типом действия 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.

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

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

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

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

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

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

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

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

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

Источник

Оцените статью
Sr.No. Константы и описание
1