Как получить действие Android Touch (вверх/вниз/перемещение) для каждого указателя/пальца из MotionEvent? (Для всех ~10 ⇐ Android
-
Anonymous
Как получить действие Android Touch (вверх/вниз/перемещение) для каждого указателя/пальца из MotionEvent? (Для всех ~10
В 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 касаний одновременно.
р>
Как это можно сделать? Спасибо за любую помощь.
В 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 касаний одновременно.
р>
Как это можно сделать? Спасибо за любую помощь.
Мобильная версия