Немного позже второй палец прикасается к экрану. Значение действия теперь равно. Что означает это десятичное число? Значение действия состоит из двух частей: индикатора, задающего указатель, для которого предназначено действие, и собственно действия, выполняемого указателем. Преобразовав десятичное значение в шестнадцатеричное, получаем x. Действие — это самый младший байт ( в этом случае), а индекс указателя — следующий по старшинству байт ( в этом примере). Обратите внимание, что это сообщает индекс указателя, но не его идентификатор. Если вы поместите на экран третий палец, значение действия станет выглядеть как x (десятичное ). Касание четвертым пальцем даст в результате значение x (десятичное ) и т.д. Вы пока еще не видели значение действия, равное, которое известно как ACTION_POINTER_DOWN. Оно подобно ACTION_DOWN, но только используется в ситуациях, связанных с мультитач.
А теперь посмотрим на следующую пару записей из LogCat . Первая запись представляет событие ACTION_MOVE (значение действия ). Вспомните, что на реальном экране трудно удерживать пальцы совершенно неподвижно. Здесь мы видим одно событие ACTION_MOVE, но их может быть и несколько. Когда первый палец убирается с экрана, мы получаем значение действия x (десятичное ). Как и ранее, индекс указателя равен, а значением действия является ACTION_POINTER_UP (аналогично ACTION_UP, но применяется в ситуациях с мультитач). Когда второй палец убирается в мультитач-ситуации, мы получаем значение действия x (десятичное ). Обратите внимание, что при получении ACTION_UP для одного из пальцев мы по-прежнему имеем информацию для обоих пальце.
Последняя пара записей . показывает еще одно событие ACTION_ MOVE для второго пальца, за которым следует событие ACTION_UP для того же второго пальца. В этот момент мы видим значение действия (ACTION_UP). Мы не получили значение действия, и ниже объяснено почему. Кроме того, обратите внимание, что как только первый палец был убран с экрана, индекс указателя для второго пальца изменился с на, но идентификатор указателя остался равен.
События ACTION_MOVE не сообщают, какой палец переместился. Для перемещения значением действия всегда будет независимо от того, сколько пальцев на экране осталось или какой палец перемещается. Все позиции пальцев, касающихся экрана, доступны внутри объекта MotionEvent, так что необходимо прочитать эти позиции и затем разобраться, что происходит. Если на экране остался только один палец, идентификатор указателя сообщит, что это за палец, и он же и перемещается по экрану. Согласно., когда на экране остается только второй палец, событие ACTION_MOVE имеет индекс указателя и идентификатор указателя, поэтому мы знаем, что перемещается второй палец.
Объект MotionEvent может содержать не только события перемещения для более чем одного пальца, но также и множество событий перемещения для каждого пальца. Это делается с использованием накопленных значений, содержащихся внутри объекта. Android должен сообщать обо всех накопленных значениях с момента существования последнего объекта MotionEvent. Для получения дополнительных сведений просмотрите документацию по getHistoricalSize и другим методам getHistorical...
Вернемся опять к началу. http://cormushka.ru/relevant_page/ Когда первый палец находится внизу, индекс указателя и идентификатор указателя равны, но почему мы не получаем для значения действия x (десятичное ), когда первый палец касается экрана перед любыми другими пальцами? К сожалению, это невозможно. Получить значение действия можно с помощью следующего сценария: коснитесь экрана сначала первым пальцем, а затем вторым, в результате чего значениями действий будут и (пока что проигнорируем события ACTION_MOVE). Теперь уберите первый палец с экрана (значение действия ) и опустите его снова на экран. Идентификатор указателя второго пальца остается равным. Пока первый палец приподнят от экрана, приложению известен только один идентификатор указателя —. После того как первый палец снова касается экрана, Android повторно назначит первому пальцу идентификатор указателя, равный, и индекс указателя, также равный. Поскольку теперь в касании участвуют несколько пальцев, мы получаем значение действия (индекс указателя и значение действия ).
Таким образом, причина кроется в обратной совместимости, но это не решает проблему. Значения действий и относятся ко времени, предшествующему появлению функции мультитач, и написанные ранее приложения будут по-прежнему работать в ситуациях, когда используется всего один палец.
Когда на экране остается только один палец, Android трактует это как случай одиночного, а не множественного касания. В результате мы получим старое значение ACTION_UP, равное, а не мультитач-значение ACTION_UP, равное. Эти случаи должны аккуратно обрабатываться в коде. Индекс указателя может дать в результате значение ACTION_DOWN, равное или, в зависимости от того, какие указатели участвуют. Убирание с экрана последнего пальца даст значение ACTION_UP, которое равно вне зависимости от его идентификатора указателя.
Существует еще одно действие, которое до сих пор не рассматривалось: ACTION_ SCROLL (со значением ), появившееся в Android. Это действие поступает от устройств ввода, подобных мыши, а не сенсорному экрану. В действительности, как можно заметить, просматривая методы класса MotionEvent, эти объекты могут использоваться для многих целей, отличных от касаний на сенсорном экране. Однако другие устройства ввода в настоящей книге не рассматриваются.
|