Неверный подсчет указателя onInterceptTouchEvent

Я хочу, чтобы мой ViewPager работал только при использовании одного пальца. Поэтому я расширил класс и реализовал onInterceptTouchEvent так:

@Override public boolean onInterceptTouchEvent(MotionEvent ev) { if(ev.getPointerCount() > 1) { return false; } return true; } 

Но getPointerCount () всегда возвращает «1», независимо от количества точек на экране. Я получаю правильный номер, когда я переопределяю onTouchEvent, но когда я делаю это, ошибка препятствует работе пейджера вообще ( http://code.google.com/p/android/issues/detail?id=18990 ) путем опрокидывания Исключение для приложения, когда вы подняли свой первый палец из мультитач: java.lang.IllegalArgumentException: pointerIndex вышел из диапазона

Как еще я могу это сделать?

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

Ошибка счетчика указателей остается, но я смог обойти исключение, которое бросается в onTouchEvent.

Я делал это, когда получал исключение:

 if(ev.getPointerCount() == 1) { return super.onTouchEvent(ev); } return false; 

Проблема в том, что когда вы поднимаете свой первый палец из мультитач, OnPouchEvent ViewPager заканчивает обработку события ACTION_UP без предварительной обработки ACTION_DOWN. Поэтому я придумал это исправление, которое позволяет избежать исключения и прекратит движение ViewPager, когда вы положите второй палец:

 private boolean moving = false; @Override public boolean onTouchEvent (MotionEvent ev) { int action = ev.getAction(); if(action == MotionEvent.ACTION_DOWN) { moving = true; } if(ev.getPointerCount() == 1) { if(moving) { return super.onTouchEvent(ev); } if(action == MotionEvent.ACTION_UP) { moving = false; } } else if(ev.getPointerCount() > 1 && moving) { ev.setAction(MotionEvent.ACTION_UP); moving = false; return super.onTouchEvent(ev); } return false; } 

Ваш onTouchEvent не работал для меня. Я буду исследовать, почему. Но между тем я сделал еще один обходной путь. Я ворвался в код ViewPager и обнаружил, что вы можете это сделать:

 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (ev.getPointerCount() > 1){ ev.setAction(MotionEvent.ACTION_CANCEL); } return super.onInterceptTouchEvent(ev); } 

GetPointerCount () работает нормально для меня. С помощью вышеописанного кода ViewPager обрабатывает также шаг ACTION_DOWN, и ошибка в нем никогда не возникает.

Поэтому я наконец выяснил, как решить ту же проблему и понять, почему это происходит в первую очередь. Я решил проблему без расширения ViewPager, но вместо этого просто установил на прослушиватель событий касания, как в примере:

 viewPager.setOnTouchListener(new OnTouchListener() { // TODO This breaks sometimes in compatibility library code, try to fix @Override public boolean onTouch(View v, MotionEvent event) { currentFragment.view.dispatchTouchEvent(event); if (!currentFragment.view.whole && event.getPointerCount() > 1) { event.setAction(MotionEvent.ACTION_CANCEL); } return false; } }); 

Так что вам нужно просто установить событие как отмененное, а не использовать его. Когда вы возвращаете значение true в событии метода onTouch, он потребляется и не переходит к пейджеру просмотра, поэтому он останавливает прокрутку. Но когда вы обрабатываете несколько событий указателя, он прерывает событие после второго касания, но сначала все еще отправляется, поэтому обработчик просмотра и сенсорный обработчик пытается действовать на мультитач и перерывы, потому что второй элемент события для второго пальца отсутствует.

Я согласен, что этого не должно произойти, и это ошибка в приведенной здесь библиотеке поддержки (я думаю, что она такова) https://code.google.com/p/android/issues/detail?id=18990 Это было отмечено Как разрешено некоторое время назад, но все же происходит в новейшей версии SupportLibrary V4