Как получить действие Android Touch (вверх/вниз/перемещение) для каждого указателя/пальца из MotionEvent? (Для всех ~10 Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как получить действие Android Touch (вверх/вниз/перемещение) для каждого указателя/пальца из MotionEvent? (Для всех ~10

Сообщение Anonymous »


В Android, который я создаю с помощью .NET MAUI, каждое событие касания характеризуется MotionEvent. Каждый MotionEvent содержит все действия, происходящие со всеми активными указателями/касаниями в данный момент.

MotionEvent.PointerCount в MAUI сопоставляется с getPointerCount(), который дает вам количество содержащихся указателей (активные пальцы).

getPointerID(int i) как в MAUI, так и в базовом Android предоставляет вам идентификатор указателя для каждого i активного массива указателей.

getX(i) и getY(i) или getRawX(i)/getRawY(i) получить позицию для любого заданного i активного массива указателей.

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

Итак, вы можете сделать:

for (int i =0; i < MotionEvent.PointerCount; i++){ Vector2 pos = новый Vector2(getX(i), getY(i); int pointerID = getPointerID (я); } Но как получить действие (вверх/вниз/перемещение) для i? Устройства Android обычно поддерживают до 10 одновременных касаний.

Я понимаю систему флагов, закодированную с помощью MotionEvent.Action (getAction()), MotionEvent.ActionMasked (getActionMasked() ) содержит в одной записи флага состояние всех десяти возможных касаний одновременно. Мы получаем только одну запись флага такого типа на каждый MotionEvent, инкапсулирующую все возможные 10 касаний одновременно.

Я понимаю, что теоретически это можно использовать с MotionEventActions.PointerIndexMask и MotionEventActions.PointerIdShift для доступа к этим данным, но я не понимаю, как перебирать их и извлекать действие либо по идентификатору указателя, либо по i в массиве указателей.

Я могу использовать некоторые существующие флаги и логику, чтобы получить следующее, работающее при трех касаниях:

for (int i =0; i < MotionEvent.PointerCount; i++){ Состояние MotionEventActions = MotionEventActions.Move; если (e.Event.PointerCount == 1) { if (e.Event.Action == MotionEventActions.Down) { состояние = MotionEventActions.Down; } иначе, если (e.Event.Action == MotionEventActions.Up) { состояние = MotionEventActions.Up; } } еще { если (я == 0) { //состояние = MotionEventActions.Move; //должен двигаться, поскольку в индексе над ним еще есть хотя бы один указатель } иначе, если (я == 1) { если (e.Event.Action.HasFlag(MotionEventActions.Pointer2Down)) { состояние = MotionEventActions.Down; } иначе, если (e.Event.Action.HasFlag(MotionEventActions.Pointer2Up)) { состояние = MotionEventActions.Up; } } иначе, если (я == 2) { если (e.Event.Action.HasFlag(MotionEventActions.Pointer3Down)) { состояние = MotionEventActions.Down; } иначе, если (e.Event.Action.HasFlag(MotionEventActions.Pointer3Up)) { состояние = MotionEventActions.Up; } } } } Но это очень грубо и не может быть расширено более чем на 3 касания. Теоретически я считаю, что сбой может произойти и в том случае, если два действия на двух пальцах произойдут одновременно.

Я пробовал использовать int index = ((int)getAction & (int)PointerIndexMask) >> (int)PointerIdShift;, но это не дает полезной информации и постоянно возвращает 0. Я обыскал все и не нашел четкого объяснения, как извлечь состояние вверх/вниз/перемещение каждого из 10 возможных касаний из этой единственной записи флага, которая охватывает все 10 касаний одновременно.
р>
Как это можно сделать? Спасибо за любую помощь.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»