Урок 103

- обработване на множество докосвания

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

Системата може да обработва до 10 докосвания включително. Има мнение, че това по някакъв начин е свързано с броя на пръстите на ръцете :) Имайте предвид, че не всички устройства поддържат 10 докосвания.

Помислете за системата за събития за мултитъч. ACTION_POINTER_DOWN и ACTION_POINTER_UP се добавят към събитията ACTION_DOWN, ACTION_MOVE и ACTION_UP.

ACTION_DOWN - задейства се при докосване на първия пръст ACTION_POINTER_DOWN - задейства се при докосване на всеки следващ пръст ACTION_MOVE - задейства се при всяко движение ACTION_ POINTER_UP - задейства се при отпускане на всеки пръст с изключение на последния ACTION_UP - задейства се при отпускане на последния пръст

Сега трябва да разберем как да разграничим - за кой пръст са задействани събитията ACTION_POINTER_DOWN и ACTION_POINTER_UP. За целта се използват две системи за номериране -индексиID.

Индекс– пореден номер на пръста. Не е свързан с пръст - един пръст може да има различни индекси по време на едно докосване.

ID- завързан за пръста от началото до края на докосването.

За да стане по-ясно, разгледайте ситуацията с три пръста. Нека ги обозначим - P1, P2 и P3. Ще докоснем екрана с тях и ще видим какви индекси и идентификатори им присвоява системата.

Докоснете екрана с пръст P1.

За P1: индекс = 0, >

След това докоснете екрана с пръст P2, без да пускате P1. Получаваме следните данни:

P1: индекс = 0, > P2: индекс = 1, >

След това докоснете екрана с пръст P3, без да пускате P1 и P2. Получаваме следните данни:

P1: индекс= 0, > P2: индекс = 1, > P3: индекс = 2, >

Сега отпуснете пръста P1. Получаваме:

P2: индекс = 0, > P3: индекс = 1, >

Виждаме, че P2 и P3 са запазили идентификаторите си, но индексите им са се изместили.

Нека пуснем пръста P2, получаваме:

P3 запази своя ID, който беше първоначално. И неговият индекс първо беше 2, след това 1, сега 0.

Държим P3. Докоснете екрана с пръст P1, получаваме:

P1: индекс = 0, > P3: индекс = 1, >

P1 получи първия свободен ID - 0. Индексът му също стана 0. А P3 получи индекс 1.

Държим P3 и P1. Докоснете екрана с пръст P2, получаваме:

P1: индекс = 0, > P2: индекс = 1, > P3: индекс = 2, >

P2 получи първия безплатен ID - 1. И премести P3 в списъка с индекси.

В този пример виждаме, че новото докосване получава минималния свободен идентификатор и индексите винаги се изграждат отново, така че идентификаторите да вървят във възходящ ред. Този пример ясно показва, че идентификаторът е прикрепен към докосването (докато трае, идентификаторът е непроменен). И индексите са просто числа на докосванията, но тези числа изобщо не означават реда на докосванията. Индексите и идентификаторите могат да приемат стойности от 0 до 9.

Можем да приемем, че всички текущи докосвания се съхраняват в масив. И идентификаторите са техните идентификатори, а индексите са индексите на този масив от докосвания.

Да се ​​върнем на събитията. Събитията UP и DOWN съдържат индекса на докосване. Чрез този индекс винаги можем да получим ID. Събитието MOVE не предоставя информация за индексите. Той просто уведомява, че има някакво движение.

Нека напишем приложение, което ще показва показалеца на последния докоснат пръст, показалеца на последния освободен пръст и цялата таблица с индекси, идентификатори и координати на докосване.

Име на проекта : P1031_MultiTouchЦел за изграждане : Android 2.3.3Име на приложението : MultiTouchИме на пакета : ru.startandroid.develop.p1031multitouchСъздаване на дейност : MainActivity

няма да ни трябват отново strings.xml и main.xml, не ги пипаме.

ВonCreateсъздаваме TextView, присвояваме манипулатор на текущата дейност и го поставяме в дейността.

Разбиране наonTouch. Ако за едно докосване използвахме метода getAction, за да разберем какво събитие се е случило, тогава с мултитъч трябва да използваме getActionMasked. Индексът на докосване се определя от метода getActionIndex. Брой текущи докосвания - getPointerCount.

Ако събитието еACTION_DOWN, тогава имаме първото докосване. Поставяме етикета inTouch = true. Това ще означава за нас, че има докосвания. Моля, обърнете внимание, че в този случай разклонение не задаваме прекъсване - следващият случай разклонение (ACTION_POINTER_DOWN) също ще бъде изпълнен на ACTION_DOWN.

Ако събитието еACTION_POINTER_DOWN(или ACTION_DOWN), тогава поставяме индекса на докосване в променливата downPI. Това ще бъде показалецът на последния докоснат пръст.

Ако събитието еACTION_UP, последното докосване се прекъсва и нищо друго не докосва екрана. Задаваме inTouch = false, т.е. липса на допир. Изчистваме StringBuilder, който съдържа информация за движенията.

Ако събитието еACTION_POINTER_UP(или ACTION_UP), тогава поставяме индекса на докосване в променливата upPI. Това ще бъде индексът на последното прекъснато докосване. Тези. когато прекъсваме докосвания едно по едно, тази променлива ще съдържа, един по един, индексите на последното прекъснато.

Ако събитието еACTION_MOVE- итерираме всички съществуващи индекси. Използвайки pointerCount, ние определяме кои от тях са включени в момента и съдържат информация за докосванията. За тях пишем номера на индекса, ID (методgetPointerId) и координати (getX и getY). За неизползвани пишете само номера на индекса. Пишем всичко в StringBuilder.

Освен това, за всяко събитие, ние формираме резултат, записваме там индекса на последното докосване и последното завършено докосване. Ако в момента има докосване (inTouch), тогава добавяме съдържанието на StringBuilder към резултата с подробна информация за всички докосвания. И покажете резултата в TextView.

Нека запазим всичко и да го стартираме. На емулатора не знам как да постигна мултитъч, затова тествам на таблет. Екранна снимка от него.

докосвания

Докоснах екрана с 5 пръста (последователно от палеца до малкия пръст, >

надолупоказва, че последният докоснат пръст е бил в индекс 4

нагорепоказва, че последният премахнат пръст от екрана е бил на индекс 1

pointerCountпоказва броя на валидните докосвания

И редовете по индекси показват подробна информация за докосванията.

Методите getActionMasked и getActionIndex са достъпни само от API ниво 8.

За по-ранни версии (с API ниво 5) се използва следният метод за получаване на типа и индекса на събитието:

Това са битови операции. По принцип в нашия случай изобщо не е необходимо да разбираме какво правят. Но за общо развитие има смисъл да се запознаете с битовите операции. Тук можете да прочетете малко за това.

В следващия урок:

- използвайте фрагменти - разберете техния жизнен цикъл