2016-10-20 11 views
1

хотите вызвать событие on two fingers down на несколько миллисекунд.Событие триггера ACTION_POINTER_DOWN программно

Я могу вызвать простое касание событие, используя этот код

objImageView.getLocationOnScreen(coords); 
        int xa = coords[0]; 
        int ys = coords[1]; 
        objImageView.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, xa, ys, 0.5f, 5, 0, 1, 1, 0, 0)); 
        objImageView.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, xa, ys, 0.5f, 5, 0, 1, 1, 0, 0)); 
        objImageView.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, xa, ys, 0.5f, 5, 0, 1, 1, 0, 0)); 

Теперь, если я пытаюсь сделать то же самое для ACTION_POINTER_DOWN ничего не происходит. Вот мой код:

int[] coords = new int[2]; 
     parentLayout.getLocationOnScreen(coords); 
     int xa = coords[0]; 
     int ys = coords[1]; 
     parentLayout.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_POINTER_DOWN, xa, ys, 0.5f, 5, 0, 1, 1, 0, 0)); 
     parentLayout.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, xa, ys, 0.5f, 5, 0, 1, 1, 0, 0)); 
     parentLayout.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_POINTER_UP, xa, ys, 0.5f, 5, 0, 1, 1, 0, 0)); 

Я Google, но не смог найти ничего, чтобы попробовать. Я хочу вызвать одно и то же событие, которое вызывается, когда пользователь помещает два пальца вниз и удерживает их в течение нескольких миллисекунд.

Заранее спасибо.

+0

Ну, я все еще не могу выполнить действие. На данный момент я настоятельно призываю коды TouchListener, написав их другим методом. –

+0

Почему именно вы используете указатель действия?Если вы хотите запускать каждые несколько миллисекунд, используйте поток с таймером или другим событием синхронизации. Извлеките код onTouch в пустоту и запускайте его из обоих потоков и onTouch – Zoe

ответ

1

Чтобы имитировать «два пальца», вам необходимо создать событие движения, которое содержит более один указатель, как и вы сейчас.

Для этого используйте вариацию MotionEvent obtain, которая поддерживает несколько указателей, как задокументировано here.

MotionEvent obtain (long downTime, 
       long eventTime, 
       int action, 
       int pointerCount, 
       PointerProperties[] pointerProperties, 
       PointerCoords[] pointerCoords, 
       int metaState, 
       int buttonState, 
       float xPrecision, 
       float yPrecision, 
       int deviceId, 
       int edgeFlags, 
       int source, 
       int flags) 

Во-первых, вы должны направить событие для первого пальца (так же, как вы делали), и когда вы собираетесь моделировать MotionEvent.ACTION_POINTER_DOWN вы должны использовать выше obtain вариации.

Поля довольно понятны, убедитесь, что PARAMS являются:

  1. pointerCount = 2
  2. pointerProperties = [firstFingerPointerProperties, secondFingerPointerProperties]
  3. pointerCoords = [firstFingerPointerCoords, secondFingerPointerCoords]
1

Documentation сказал, что: «Жест начинается с события движения с ACTION_DOWN, который указывает местоположение первого указателя вниз. Поскольку каждый дополнительный указатель, который идет вниз или вверх, структура генерирует событие движения с ACTION_POINTER_DOWN или ACTION_POINTER_UP соответственно «. поэтому сначала нужно запустить простое событие касания. И посмотрите на вопрос this.

+0

Спасибо @ Andriy Я проверю, что эти –

+0

не сработали для меня. –

+0

@SyedaZunairah какой код вы пробовали? Вы должны попробовать такую ​​последовательность: 'ACTION_DOWN' ->' ACTION_POINTER_DOWN' -> опционально небольшая задержка -> 'ACTION_POINTER_UP' ->' ACTION_UP' – user1643723

1

Вы должны сгенерировать последовательность так: ACTION_DOWN ->ACTION_POINTER_DOWN -> необязательно небольшую задержку ->ACTION_POINTER_UP ->ACTION_UP.

Вы также должны правильно установить указатель указателя (и другие метаданные) для второго указателя, поскольку в противном случае код обнаружения жестов может быть не в состоянии сказать, что ACTION_POINTER_DOWN для вторичного пресса описывает вторичный палец, а не первичный.

Используйте this method, чтобы заполнить всю необходимую информацию для ACTION_POINTER_DOWN, описывая второе нажатие. Обязательно проверьте правильно pointerProperties!