А сейчас мы приступим к анализу самого интересного кода. Для зоны сбрасывания необходимо создать цель, на которую должны перетаскиваться точки. Как упоминалось ранее, компоновка определяет на экране зеленый квадрат и рядом с ним текстовое сообщение. Поскольку зона сбрасывания также является фрагментом, переопределяется метод onCreateView класса DropZone. Первым делом понадобится наполнить компоновку зоны сбрасывания и затем извлечь ссылку на представление для квадратной цели (dropTarget) и для текстового сообщения (dropMessage). После этого необходимо настроить слушатель перетаскивания для цели, чтобы знать, когда перетаскивание начинается.
Слушатель перетаскивания для цели сбрасывания имеет единственный метод обратного вызова: onDrag. Этот обратный вызов будет принимать ссылку на представление, а также объект DragEvent. Ссылка на представление относится к представлению, с которым связан объект DragEvent. Как упоминалось ранее, слушатель перетаскивания не обязательно подключается к представлению, которое будет взаимодействовать с событием перетаскивания, так что этот обратный вызов должен идентифицировать представление, для которого возникло событие перетаскивания.
Одним из первых шагов, который, вероятно, будет предприниматься в любом обратном вызове onDrag, является чтение действия из объекта DragEvent. Это позволит выяснить, что происходит. По большей части, единственное, что необходимо сделать в данном обратном вызове — это фиксация факта, связанного с возникновением события перетаскивания. Например, для события ACTION_DRAG_LOCATION в действительности ничего делать не понадобится. Однако нужно будет предусмотреть выполнение специальной логики для случая, когда объект перетаскивается внутрь заданных границ (ACTION_DRAG_ENTERED); эта логика должна отключаться, если объект либо находится вне этих границ (ACTION_DRAG_EXITED), либо же он сбрасывается (ACTION_DROP).
Здесь используется класс ObjectAnimator, введенный в, но только в коде для указания циклического интерполятора, который изменяет значение альфа-канала цели. Это обеспечит эффект пульсирования прозрачности зеленой квадратной цели, что послужит визуальной индикацией готовности цели к приему перетаскиваемого объекта. Поскольку включается анимация, необходимо позаботиться о ее отключении, когда объект отпускается или сбрасывается, т.е. когда перетаскивание завершено. Теоретически анимация должна быть остановлена при обработке события ACTION_DRAG_ENDED, но разумно останавливать ее во всех случаях.
Для этого конкретного слушателя перетаскивания необходимо получать только события ACTION_DRAG_ENTERED и ACTION_DRAG_EXITED, если перетаскиваемый объект взаимодействует с представлением, с которым он ассоциирован. И, как будет, события ACTION_DRAG_LOCATION происходят, только когда перетаскиваемый объект находится внутри целевого представления.
Единственным другим интересным условием является само действие ACTION_DROP (обратите внимание, что имя этого действия не содержит часть DRAG_). Когда объект сбрасывается на представление, это означает, что пользователь отпустил точку над зеленым квадратом. Поскольку сбрасывание этого объекта на зеленый квадрат ожидалось, можно просто прочитать данные из первого элемента и зафиксировать сообщение в LogCat. В производственном приложении объект ClipData, содержащий само событие перетаскивания, может потребовать более пристального внимания. Просмотрев его свойства, можно принять решение о том, принимать сбрасывание или нет.
Самое время обратить внимание на булевский результат метода обратного вызова onDrag. В зависимости от обстоятельств, необходимо сообщить Android о том, позаботились ли вы о событии перетаскивания (вернув true) или же нет (вернув false). Если вы не обнаруживаете внутри объекта события перетаскивания нужных данных, можете вернуть из этого метода обратного вызова значение false, которое сообщит Android, что это сбрасывание не было обработано. http://bs-rent.ru/
После фиксации в LogCat сведений из события перетаскивания производится увеличение на единицу счетчика полученных сбрасываний; это приводит к обновлению пользовательского интерфейса в части, касающейся DropZone.
Если вы еще раз на код этого класса, вы найдете его довольно простым. В нем нет ни кода, который бы работал с объектами MotionEvent, ни даже кода, который бы определял, происходит ли перетаскивание. Вы лишь получаете соответствующие обратные вызовы по мере того, как протекает последовательность перетаскивания.
Опубликовал katy
February 17 2015 19:11:36 ·
0 Комментариев ·
3060 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.