Андроид студио перемещение imageview пальцем

Содержание
  1. Андроид студио перемещение imageview пальцем
  2. Android-вращение ImageView пальцем перемещает другие виды вокруг
  3. 3 ответов
  4. Русские Блоги
  5. Android с нуля реализует настраиваемый ImageView, который может масштабировать двумя пальцами, свободно перемещаться и дважды щелкать для увеличения
  6. Android с нуля реализует настраиваемый ImageView, который может масштабировать двумя пальцами, свободно перемещаться и дважды щелкать для увеличения
  7. Раньше я всегда использовал чужие колеса, и мне всегда было неловко в моем сердце, поэтому я также пытаюсь сделать некоторые колеса, сделанные другими, чтобы улучшить себя, и я могу использовать их более умело в своей обычной работе по развитию.
  8. На этот раз, начиная с нуля, ImageView, который может перемещаться одним пальцем, дважды щелкать для увеличения, масштабировать двумя пальцами и перемещать двумя пальцами.
  9. Первый шаг: наследовать ImageView и сделать изображение отображаемым в центре после масштабирования.
  10. Шаг 2. Дважды щелкните для увеличения
  11. Шаг 3: ущипните, чтобы увеличить
  12. Шаг 4. Переместите изображение одним или двумя пальцами.
  13. Android-перемещение ImageView на экране (например, перетаскивание)
  14. редактировать
  15. Примечание
  16. 6 ответов
  17. Android — перетаскивание
  18. Процесс перетаскивания
  19. Класс DragEvent
  20. Константы

Андроид студио перемещение imageview пальцем

В этом уроке мы научимся создавать движение объекта по экрану с полным контролем этого движения прикосновением пальца. У нас на экране будет находится всеми любимое изображение 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 следующий код:

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

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

Источник

Android-вращение ImageView пальцем перемещает другие виды вокруг

Я изучаю Android уже около двух недель (эксперт в as2 / 3).

Я создал простой LinearLayout1, which contains an ImageView’, содержащий png виниловой записи (просто круговой диск в основном)

Я установил это ImageView поворачивается, когда пользователь проводит пальцем по нему, как царапает запись.

мой код, кажется, работает (не уверен, если это лучший способ, но он работает). Проблема в том, когда ImageView поворачивается он толкает другие виды вокруг. Я определили это потому, что мое круглое изображение действительно квадрат с прозрачными углами. Именно эти углы подталкивают другие виды вокруг и заставляют запись отталкиваться от левой стороны экрана, если у меня есть ImageView — по левому.

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

если кто-то мог бы пролить свет на то, что я могу сделать, чтобы решить это было бы здорово. Я понимаю, что простой ответ может не существовать, но имейте в виду, что я Java noob и держите его так просто, как вы можете! Большое спасибо заранее за любую помощь!

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

вот мой xml разметка:

и вот мой Java-код:

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

это оказывается раздражающей проблемой. Должен быть способ повернуть изображение, которое является большим или большим, чем экран, без его масштабирования, чтобы все изображение оставалось на экране. Почему часть вращающегося изображения не может исчезнуть с экрана? Очень неприятно. Я попытался обернуть ImageView на FrameView, которым частично помог. Теперь я могу добавить другие виды, которые не будут затронуты, но я все еще не могу иметь свой диск достаточно большим, потому что ему не разрешено проходить границы экрана, когда он вращается. Не понимаю почему. Я не проверял расширение ImageView еще. Любые другие мысли все равно будут оценены!

Читайте также:  Сертификат цифровой подписи для андроид

3 ответов

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

Идея 1: Попробуйте использовать макет рамки, и ваш вид вращается внутри Идея 2: попробуйте пользовательский подкласс представления и нарисуйте свой проигрыватель в onDraw. В интернете найдите пример рисования компаса для запуска.

Источник

Русские Блоги

Android с нуля реализует настраиваемый ImageView, который может масштабировать двумя пальцами, свободно перемещаться и дважды щелкать для увеличения

Android с нуля реализует настраиваемый ImageView, который может масштабировать двумя пальцами, свободно перемещаться и дважды щелкать для увеличения

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

На этот раз, начиная с нуля, ImageView, который может перемещаться одним пальцем, дважды щелкать для увеличения, масштабировать двумя пальцами и перемещать двумя пальцами.

Это сообщение в блоге длиннее, если вы хотите увидеть полный код напрямую, потяните его до конца.

Давайте сначала посмотрим на эффект

Первый шаг: наследовать ImageView и сделать изображение отображаемым в центре после масштабирования.

Это выглядит так после запуска

Картинка отображается не полностью, тогда пусть картинка масштабируется по умолчанию и потом отображается по центру

Если вы хотите добиться пропорционального масштабирования, вам необходимо знать ширину и высоту ImageView, а также исходную ширину и высоту изображения, ширину и высоту ImageView можно получить в методе onMeasure, а ширину и высоту изображения можно получить с помощью класса Drawable в следующем коде , Есть еще яма при получении ширины и высоты картинки, о которой будет сказано позже.

Затем отношение ширины нашего ImageView к ширине изображения и отношение высоты ImageView к высоте изображения, контрастируйте коэффициент масштабирования ширины и высоты и возьмите меньшее значение в качестве коэффициента масштабирования изображения.

Вот объяснение того, почему меньший используется в качестве коэффициента масштабирования изображения, потому что нам нужно, чтобы изображение было пропорционально масштабировано и отображено полностью. Здесь, на том же мобильном телефоне, в том же настраиваемом ZoomImageView вы можете учитывать x of viewSize, y фиксируется, то есть в следующей формуле числитель фиксирован, поэтому, если все значение меньше, знаменатель больше, что означает, что сторона изображения и сторона обзора Чем больше зазор, тем масштабирование в соответствии с коэффициентом масштабирования стороны с большей разницей определенно гарантирует, что полное отображение в поле зрения будет гарантировано.

Получив коэффициент масштабирования, мы можем увеличить изображение

Полный код этого шага выглядит следующим образом

Эффект от операции следующий

На этом этапе изображение отображается полностью, но оно не отображается в центре, поэтому следующим шагом является решение проблемы отображения изображения в центре.

Выше приведен метод панорамирования изображения.

Затем вам необходимо рассчитать объем перевода, необходимый, если вы хотите, чтобы изображение отображалось в центре ImageView.

Как упоминалось ранее, чем меньше значение масштабирования в двух направлениях, тем больше разница между значением вида в этом направлении и значением изображения. Согласно этому меньшему значению масштабирования, после масштабирования это направление просто заполнит вид, тогда это направление будет Не нужно панорамировать, просто панорамируйте в другом направлении. Если вы не поняли, то можете сами нарисовать картинку на бумаге.

Итак, здесь первый шаг — это пропорциональное масштабирование, и центральный дисплей готов. Весь код на данный момент выглядит следующим образом

Схема эффекта выглядит следующим образом

Шаг 2. Дважды щелкните для увеличения

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

Затем мы реализуем OnTouchListener для реализации метода onTouch и сделаем некоторые суждения о событиях.

Перед формальной обработкой события мы сначала определяем несколько переменных и определяем три состояния двойного щелчка и масштабирования.

Читайте также:  Парковка машины для андроид

Ниже приводится обработка события нажатия экрана.

Эффект операции следующий, который также реализует эффект двойного щелчка в месте увеличения

Шаг 3: ущипните, чтобы увеличить

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

Давайте сначала рассмотрим первый вопрос, если вы измените операцию масштабирования двумя пальцами на точечную. На самом деле это очень просто: нам нужно только вычислить среднюю точку между двумя пальцами и использовать ее в качестве фактической точки масштабирования, как двойной щелчок по точке масштабирования.

Давайте посмотрим на второй вопрос, коэффициент масштабирования. Это тоже просто. Вам нужно только получить, насколько два пальца вместе в начале, а затем отслеживать процент измененного расстояния между двумя пальцами до исходного расстояния. Нет необходимости судить, уменьшать или увеличивать масштаб по отдельности.

Посмотрите на фактический код ниже

Кроме того, вам нужно назначить начальный коэффициент масштабирования для doubleFingerScrole в методе showCenter.

Ладно, посмотрим эффект

Шаг 4. Переместите изображение одним или двумя пальцами.

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

Посмотрим на эффект еще раз

Остается еще последняя небольшая особенность. Когда коэффициент масштабирования изображения меньше исходного, пусть он автоматически вернется к нормальному коэффициенту масштабирования.

Код очень простой, добавьте в ветку MotionEvent.ACTION_POINTER_UP метода onTouch

К этому моменту функции выполнены, но помните яму, о которой я упоминал в начале? То есть вызвать getDrawable () в методе onMeasure, чтобы получить объект Drawable изображения. Здесь, если вы случайно получите пустой Drawable, у нас нет проблем, потому что мы назначаем изображение для отображения непосредственно в макете, но фактическое Во время разработки он, вероятно, будет динамически получен после запуска кода. В это время это настраиваемое представление будет сообщать об ошибке, как только оно будет загружено.

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

На этом создание этого простого настраиваемого представления готово. Многие реализации, описанные в статье, не являются оптимальными идеями реализации, но это самые простые идеи для понимания обычных людей. Здесь каждый может указать на недостатки в статье. Если у вас есть лучшее решение, добро пожаловать в общение.

Источник

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 поддерживается перетаскивание вида на другие виды или группы видов. Структура включает в себя следующие три важных компонента для поддержки функции перетаскивания —

Читайте также:  Trashbox ru link roblox android

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

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

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

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

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

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

Начато — это событие возникает, когда вы начинаете перетаскивать элемент в макете, ваше приложение вызывает метод 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.

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

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

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

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

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

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

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

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

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

Источник

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