Интересная проблема касания андроида - PullRequest
2 голосов
/ 11 ноября 2011

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

final TextView tv = (TextView)findViewById(R.id.TextView01);

        tv.setOnTouchListener(new View.OnTouchListener() {
            int count1 =0;
            int count2=0;
            public boolean onTouch(View arg0, MotionEvent event) {
                Log.d("Code777","Touch is being called finger");
                int i = event.getPointerCount();



                if(i==1 )
                {
                    if(count1==0)
                    {
                        Log.d("Code777","Touched with 1 finger");
                        count1++;
                        count2=0;
                    }

                }

                 if (i==2 )
                {
                     if(count2==0)
                     {
                        Log.d("Code777","Touched with 2 fingers");
                        edit.append(tv.getText());  
                        count2++;
                        count1=0;
                     }
                }
                return true;
            }
        });

Я что-то не так делаю ??Он печатает журнал более 3-4 раз как в одно касание, так и в два касания

Проблема обновленной проблемы заключается в том, что оба события запускаются сейчас

  if(event.getAction() == MotionEvent.ACTION_POINTER_2_DOWN)
                {
                    Log.d("Code777","2 finger touch");
                    return true;
                }else if(event.getAction() == MotionEvent.ACTION_DOWN)
                {
                        Log.d("Code777","Touched with 1 finger");


                    return true;
                }

Ответы [ 2 ]

7 голосов
/ 11 ноября 2011

Ваш код будет выполняться во время каждого сенсорного события.Когда он активируется в первый раз, он, скорее всего, относится к событию ACITON_DOWN (когда пользователь впервые касается экрана).Во второй раз это, скорее всего, относится к событию ACTION_UP (когда пользователь убирает палец с экрана).Аналогично, если вы проведете пальцем по экрану, один и тот же код будет выполняться много раз для события ACTION_MOVE.Вы должны проверить, какие типы прикосновений это.Сделайте что-то вроде этого:

switch(event.getAction()){
   case MotionEvent.ACTION_DOWN:
     // Do something that should only happen when the user first touches the screen
     break;
   case MotionEvent.ACTION_MOVE:
     // Do something that should only happen when the user is touching the screen
     break;
   case MotionEvent.ACTION_UP:
     // Do something that should only happen when the user stops touching the screen
     break;
}

РЕДАКТИРОВАТЬ:

Мультитач в Android странно в лучшем случае.Не все устройства могут справиться с этим.Не все устройства могут обрабатывать более x раз касаний и т. Д. Если вы хотите обрабатывать чехлы DOWN для отдельных пальцев, то вы можете использовать элементы ACTION_POINTER_X.Если бы у вас была такая серия событий:

1.  User touches screen
2.  User touches screen with second finger
3.  User lifts finger 1
4.  User touches screen with finger 1
5.  User lifts finger 2
6.  User touches screen with finger 2
7.  User lifts both finger 1 and finger 2
8.  User touches screen with only finger 2
9.  User touches screen with finger 1

События, которые будут запущены, будут такими:

1.  ACTION_DOWN
2.  ACTION_POINTER_2_DOWN
3.  ACTION_POINTER_1_UP
4.  ACTION_POINTER_1_DOWN
5.  ACTION_POINTER_2_UP
6.  ACTION_POINTER_2_DOWN
7.  ACTION_UP (also, one of the pointers actions will fire depending on which finger was lifted first)
8.  ACTION_DOWN
9.  ACTION_POINTER_2_DOWN

И т. Д.

1 голос
/ 11 ноября 2011

onTouchListener отправляет вам несколько действий через MotionEvents.Вы можете получить действие для текущего события с помощью MotionEvent.getAction().

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

Например, просто вернитесь из onTouch (), когдапроизошло событие перемещения.

public boolean onTouch(View arg0, MotionEvent event) {
    Log.d("Code777","Touch is being called finger");

    if(event.getAction() == MotionEvent.ACTION_MOVE) {
        Log.d("Code777", "Move event detected, ignored!");
        return false;
    }

    // Further processing ..
}

или используйте переключатель для различения всех соответствующих событий.

Список возможных действий приведен в документации класса MotionEvent . .

...