Android studio event getaction

SurfaceView

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

Найти данный элемент можно в разделе Advanced.

В основе SurfaceView объект Surface, а не Canvas. Это важно, потому как Surface поддерживает рисование из фоновых потоков. Данное отличие особенно полезно для ресурсоемких операций или быстрых обновлений, а также когда необходимо обеспечить высокую частоту изменения кадров (использование трехмерной графики, создание игр или предпросмотр видеопотока с камеры в режиме реального времени.

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

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

Применяя OpenGL, вы можете рисовать на Surface любые поддерживаемые двумерные или трехмерные объекты, получая при этом все выгоды от аппаратного ускорения (если таковое имеется). Таким образом, вы значительно повышаете производительность, если сравнивать с теми же операциями, выполненными на двумерном Canvas.

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

Создание нового объекта SurfaceView

Чтобы создать данный тип, наследуйте класс SurfaceView и реализуйте интерфейс SurfaceHolder.Callback, описывающий функцию обратного вызова. Он уведомляет представление о том, что исходный объект Surface был создан/уничтожен/модифицирован и передает в объект SurfaceHolder ссылку, содержащую допустимый экземпляр Surface.

Типичный шаблон проектирования SurfaceView предусматривает классы, производные от Thread, которые принимают ссылку на текущий объект SurfaceHolder и немедленно его обновляют.

SurfaceView с поддержкой касаний

Напишем простой пример использования SurfaceView, на котором можно рисовать линии.

Запустив проект, вы можете рисовать пальцем по экрану.

Гроза эпилептиков

Попробовал данный пример. При рисовании рисуются окружности, которые постоянно мигают. Жуткое зрелище.

В примере реализовано:

  • новый класс MySurfaceView, наследующий от SurfaceView и реализующий интерфейс SurfaceHolder.Callback
  • используются методы surfaceCreated(), surfaceDestroyed(), surfaceChanged() для SurfaceHolder.Callback
  • используется класс Thread для SurfaceView

Поймай меня

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

Этот же пример, но с использованием разметки FrameLayout, внутри которой находится SurfaceView, находится здесь. Не буду приводить код.

Продолжение серии примеров — Exercise of SurfaceView: SurfaceView overlap with a LinearLayout. Здесь появляется возможность выбрать цвет точки.

Отскакивающие значки

Ещё один пример — при касании экрана в области SurfaceView будет появляться новая картинка, которая будет двигаться внутри контейнера, отскакивая от стенок.

Источник

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

MotionEvent Подробно

Android помещает все входные события в MotionEvent. Поскольку Android продолжает расти и расти, MotionEvent также становится все более и более сложным. Ниже приводится краткое описание событий MotionEvent, которые я организовал сам:

номер версии обновить контент
Android 1.0 (API 1 ) Поддерживает события в одно касание и трекбол.
Android 1.6 (API 4 ) Поддержка жестов.
Android 2.2 (API 8 ) Поддержка мультитач.
Android 3.1 (API 12) Поддержка стилуса, мыши, клавиатуры, джойстика, игрового контроллера и других инструментов ввода.

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

MotionEvent отвечает за централизованную обработку входных событий всех типов устройств, но из-за низкой вероятности использования некоторых устройств эта статья игнорирует объяснение или кратко объясняет, например:

1. Трекбол появляется только на самых ранних устройствах. Он больше не виден на современных устройствах и не будет описан в этой статье.

2. Процесс обработки стилуса и пальца в основном одинаков, подробностей нет.

Читайте также:  Подключение по юсб андроид как модем

3. Вероятность использования мыши на мобильном телефоне также относительно невелика, что будет кратко описано в конце статьи.

Одно касание

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

событие Введение
ACTION_DOWN ПалецПервый контакт с экраномСрабатывает когда.
ACTION_MOVE ПалецПроведите пальцем по экрануПри срабатывании он будет запущен несколько раз.
ACTION_UP ПалецВыключить экранСрабатывает когда.
ACTION_CANCEL МероприятияПерехватывается верхними слоямиСрабатывает когда.
ACTION_OUTSIDE ПалецНе в зоне контроляСрабатывает когда.

И следующие методы:

метод Введение
getAction() Получить тип события.
getX() Получить координату X точки касания в текущем представлении.
getY() Получить координату Y точки касания в текущем представлении.
getRawX() Получить координату X точки касания на весь экран.
getRawY() Получить координату Y точки касания на весь экран.

Простой процесс взаимодействия одним касанием выглядит так:

Пальцы вниз (ACTION_DOWN) -> Переместить несколько раз (ACTION_MOVE) -> Выйти (ACTION_UP)

  • В этом случае ACTION_MOVE был запущен несколько раз.
  • Если это всего лишь щелчок (нажатие пальцем и поднятие), ACTION_MOVE не будет запущен.

Обработка событий в одно касание обычно записывается так:

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

Но есть два специальных события: ACTION_CANCEL с ACTION_OUTSIDE 。

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

ACTION_CANCEL

ACTION_CANCEL Условием запуска является то, что событие перехватывается верхним уровнемОднако мыПринцип механизма распределения событийВ этой статье я узнал, что когда событие перехватывается верхним представлением, ChildView не может получать какие-либо события, а ChildView не может принимать какие-либо события и, естественно, не будет их получать. ACTION_CANCEL Итак, так это ACTION_CANCEL Правильные условия запуска не такие, так что же это?

Фактически, только когда представление верхнего уровня освобождает право обработки события, ChildView получит ACTION_CANCEL Мероприятия.

Это может быть нелегко понять, давайте приведем пример?

Например: верхний вид является RecyclerView, он получил ACTION_DOWN Событие, потому что это может быть событие щелчка, поэтому оно сначала передается в соответствующий ItemView, спрашивая ItemView, нужно ли это событие, но затем передает другое ACTION_MOVE Событие и направление движения совпадают с направлением скольжения RecyclerView, поэтому RecyclerView определяет, что это событие является событием прокрутки, поэтому ему необходимо отозвать права на обработку события, и соответствующий ItemView получит ACTION_CANCEL И не будет получать последующие события.

Популярный?

RecyclerView: разбить его, есть один здесь ACTION_DOWN Вы видите, хотите вы этого или нет.

ItemView: Хорошо, давайте посмотрим.

RecyclerView: Привет? Это было на самом деле мобильное событие ACTION_MOVE , Я собираюсь свернуть, разбить его, я мог бы отправить вас в дом вашего дяди (кеш) ACTION_CANCEL , Вы должны закрыть это.

Это наиболее вероятно увидеть в реальной разработке ACTION_CANCEL Сцена исчезла.

ACTION_OUTSIDE

ACTION_OUTSIDE Условие срабатывания еще более странное. Буквально, не означает ли это, что снаружи находится за пределами области? Тем не менее, независимо от того, как вы скользите за пределы области управления, он не сработает ACTION_OUTSIDE этот инцидент Я полагаю, что многие маги очень озадачены этим. Что, если это далеко за пределами области?

На самом деле это событие здесь вообще не используется, см. Официальное объяснение

A movement has happened outside of the normal bounds of the UI element. This does not provide a full gesture, but only the initial location of the movement/touch.

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

Мы знаем, что при нормальных обстоятельствах, если исходная позиция щелчка находится за пределами области просмотра, для представления невозможно получить события. Однако, все не является абсолютным. Должны быть некоторые особые случаи. Не забудьте нажать Закрыта ли область диалога? Диалог — это особый вид (нет окна, занимающего размер экрана), и он может принимать события за пределами области просмотра (хотя при нормальных обстоятельствах вы вообще не можете использовать это событие), за исключением Диалога, вы, скорее всего, увидите это Сцена события — это плавающее окно. Конечно, если вы хотите получать события за пределами представления, вам нужны специальные настройки.

Установите флаги параметров макета WindowManager для представления FLAG_WATCH_OUTSIDE_TOUCH , Так что когда событие click происходит за пределами этого представления, представление может получить ACTION_OUTSIDE Мероприятия.

Поскольку вероятность этого события относительно мала, я не буду здесь вдаваться в подробности. Я объясню это подробно, когда буду использовать его позже.

Читайте также:  Дополнения для гугл хром для андроид

мультитач

Android начал поддерживать multi-touch в версии 2.2. После появления multi-touch многие вещи стали неприятными. Первая проблема, которую нужно решить, этоОдновременное нажатие нескольких пальцев на экране вызовет много событий. Как эти события следует различать?

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

Первый нажатый палец специально рассматривается как основной указатель, а нажатый палец используется как вспомогательный указательИ затем были получены следующие события (обратите внимание на увеличение событий и изменений в профиле событий):

событие Введение
ACTION_DOWN ПервыйПалецПервый контакт с экраномСрабатывает когда.
ACTION_MOVE ПалецПроведите пальцем по экрануПри срабатывании он будет запущен несколько раз.
ACTION_UP последнийПалецВыключить экранСрабатывает когда.
ACTION_POINTER_DOWN Есть неосновное нажатие пальцем (То есть на экране уже есть пальцы перед нажатием)。
ACTION_POINTER_UP Есть неосновные подтяжки пальцев (После поднятия на экране все еще остаются пальцы)。
Следующие типы событий не рекомендуются ------------------
ACTION_POINTER_1_DOWN Второе нажатие пальца отбрасывается и не рекомендуется.
ACTION_POINTER_2_DOWN Нажатие третьего пальца отбрасывается и не рекомендуется.
ACTION_POINTER_3_DOWN 4-е нажатие пальца отбрасывается и не рекомендуется.
ACTION_POINTER_1_UP Второй палец поднимается и выбрасывается, не рекомендуется.
ACTION_POINTER_2_UP Третий палец поднимается и выбрасывается, не рекомендуется.
ACTION_POINTER_3_UP Четвертый палец поднят и сброшен, это не рекомендуется.

И следующий метод:

метод Введение
getActionMasked() против getAction() Аналогичный,Multi-Touch должен использовать этот метод, чтобы получить тип события
getActionIndex() Получить указатель (палец), вызвавший событие.
getPointerCount() Получите количество пальцев на экране.
getPointerId(int pointerIndex) Получите уникальный идентификатор идентификатора указателя (пальца). Идентификатор всегда одинаков между нажатием и поднятием пальца.
findPointerIndex(int pointerId) Получите PointIndex в текущем состоянии через PointerId, а затем получите другой контент через PointIndex.
getX(int pointerIndex) Получить координату X указателя (пальца)
getY(int pointerIndex) Получить координату Y указателя (пальца)

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

getAction () и getActionMasked ()

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

В общем, мы можем различить, добавив атрибут индекса типа int к событию, но мы знаем, что инженеры Google имеют чистоту (вПользовательский вид классификации и процессаЭто было замечено в onMeasure), чтобы добавить атрибут индекса, который обычно не превышает 10, просто невыносимо тратить пространство int-size, поэтому инженеры напрямую объединили атрибут индекса и тип события.

Тип int имеет 32 бита (0x00000000), они используют младшие 8 бит (0x000000 *)ff) Указывает тип события, за которым следуют 8 бит (0x0000)ff* 00) указывает номер события, взяв палец в качестве примера, чтобы объяснить, как синтезируются значения:

Значение по умолчанию ACTION_DOWN равно (0x00000000)

Значением ACTION_POINTER_DOWN по умолчанию является (0x00000005)

Палец пресс Триггерное событие (числовое значение)
1-е нажатие пальца ACTION_DOWN (0x0000 00 00)
2-е нажатие пальца ACTION_POINTER_DOWN (0x0000 01 05)
3-е нажатие пальца ACTION_POINTER_DOWN (0x0000 02 05)
4-е нажатие пальца ACTION_POINTER_DOWN (0x0000 03 05)

нота:

Значение, указанное жирным шрифтом в приведенной выше таблице. Вы можете видеть, что с увеличением количества нажатых пальцев это значение также постоянно изменяется, что, в свою очередь, побуждает нас использовать getAction() Полученные значения нельзя сравнивать со стандартными типами событий. Для решения этой проблемы они создали getActionMasked() Метод, этот метод может очистить значение индекса и превратить его в стандартный тип события.

1. Должен использоваться для мультитач getActionMasked() Получить тип события.

2. Поскольку значение события не меняется в течение одного касания, используйте getAction() с getActionMasked() Оба метода в порядке.

3. Используйте getActionIndex (), чтобы получить значение индекса. Тем не менее, обратите внимание, что getActionIndex () действителен только для перемещения вверх и вниз, но не для перемещения.

На данный момент, получение типа события использует getActionMasked() Этого достаточно, но если вам нужно скомпилировать античную версию, вы можете использовать этот способ написания:

PointId

Хотя я только что упомянул actionIndex ранее, вы можете использовать getActionIndex (), чтобы получить его, но с помощью actionIndex буквально знает, что это представляет только порядковый номер события, и, согласно документу с пояснениями, этот ActionIndex используется только тогда, когда палец нажат (вниз) и поднят ( вверх) полезно, бесполезно при движении, очень важной частью отслеживания событий является перемещение, но это бесполезно, что слишком нереально ( ̄Д ̄) ノ

Читайте также:  Как перезагрузить андроид если не работает кнопка включения

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

PointId генерируется при нажатии пальца и исчезает после его поднятия или отмены события.Это единственный постоянный идентификатор в процессе события, который может быть передан при нажатии пальца. getPointerId(int pointerIndex) Возьми. (PointerIndex в параметре является actionIndex)

Такие вопросы, как отслеживание потока событий, будут подробно объяснены при объяснении мультитач.

Исторические данные (пакетная обработка)

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

событие Введение
getHistorySize() Получить размер коллекции исторических событий
getHistoricalX(int pos) Получить координату x исторического события pos
(pos getPressure() Это моделируется с использованием области контакта.

4. Из-за некоторых неизвестных причин (возможно, системной версии и аппаратных проблем) некоторые устройства не поддерживают этот метод.

Я проверил два метода на разных устройствах, но результаты на разных устройствах были разными. После проверки я обнаружил, что это системная проблема, и только на некоторых устройствах getSize() Доступно, некоторые устройства имеют только getPressure() Можно использовать, но некоторые нет.

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

События мыши

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

событие Введение
ACTION_HOVER_ENTER Указатель перемещается в окно или область просмотра, но не нажимается.
ACTION_HOVER_MOVE Указатель перемещается в окне или области просмотра, но не нажимается.
ACTION_HOVER_EXIT Указатель перемещается в окно или область просмотра, но не нажимается.
ACTION_SCROLL Прокрутка колес может вызвать горизонтальную прокрутку (AXIS_HSCROLL) или вертикальную прокрутку (AXIS_VSCROLL)

1. Эти типы событий были добавлены в Android 4.0 (API 14).

2. Используйте getActionMasked() Получить эти типы событий.

Оценка типа устройства ввода

Решение о типе устройства ввода также добавлено в Android 4.0 (API 14), в основном, в том числе следующих типов устройств:

Тип оборудования Введение
TOOL_TYPE_ERASER ластик
TOOL_TYPE_FINGER Палец
TOOL_TYPE_MOUSE мышь
TOOL_TYPE_STYLUS стилус
TOOL_TYPE_UNKNOWN Неизвестный тип

использование getToolType(int pointerIndex) Чтобы получить соответствующий тип устройства ввода, pointIndex может быть 0, но должно быть меньше getPointerCount() 。

подводить итоги

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

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

Интеллектуальная рекомендация

Многослойная презентацияViewController Jap

. Недавно, проект использует многоэтажные прыжки [A presentViewController: B animated: YES] [B presentViewController: C animated: YES] . Проблема в том, где: как это идет прямо к? Я не нашел ме.

Распечатать список с конца до головы

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

Типы данных и переменные

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

Python Daily Practice (4) -идиомы заполняют музыку

оглавление 1. Одно место 2. Случайное расположение 3. Добавьте баллы для оценки 4. Получение файла 5. Установите уровень сложности. 6. Срок завершения 7. Выберите заполнение пропусков. 1. Одно место Н.

Источник

Оцените статью