Android多點(diǎn)觸控時出現(xiàn)pointerIndex out of range 的錯誤分析
關(guān)于多點(diǎn)觸控時出現(xiàn)pointerIndex out of range這個問題在網(wǎng)上查了好多資料,有以下幾種情況:
-
1.Android自身的問題,需要重新編譯代碼:這個沒有驗(yàn)證過弃锐;
-
2.將返回結(jié)果改為return false; :這是一個老外寫的解決方法,本來以為能解決問題蒙兰,結(jié)果....呵呵了扇住,連單點(diǎn)的拖動都不能用了-.-!!
-
3.沒有處理異常:IllegalArgumentException
這個靠點(diǎn)譜迈窟,因?yàn)榭刂婆_確實(shí)也報(bào)了這個錯誤,但一般文章都只貼了try{}catch代碼挎塌,沒寫為什么徘六,試了好多次,“一拖動”圖片沒了榴都!
下面是具體的報(bào)錯日志:
E/CrashReport: java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(Native Method)
at android.view.MotionEvent.getX(MotionEvent.java:2080)
at androidx.viewpager.widget.ViewPager.onInterceptTouchEvent(ViewPager.java:2072)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2120)
這個問題通過重寫viewpager 然后try()catch onInterceptTouchEvent()
的內(nèi)容就可以解決
問題分析
這個問題的這個準(zhǔn)確的位置是在event.getX(int)和event.getY(int)中會報(bào)錯待锈,因?yàn)槟愕挠|控點(diǎn)(那個int參數(shù))可能越界了!我的問題是在兩點(diǎn)觸控后嘴高,有一個手指抬起的時候出現(xiàn)的竿音,發(fā)現(xiàn)問題了沒有!K┩浴4核病!當(dāng)兩點(diǎn)觸控后抬起一個手指的時候只有一個觸控點(diǎn)了莹汤,通過event.getX(1)的時候就越界了快鱼!所以只是try{}catch{}是可以解決問題,但是沒解決根本問題的颠印。
這個問題的根本在于判斷動作的時候可能沒有做好case:MotionEvent.ACTION_POINTER_UP這個動作的處理纲岭,或沒有調(diào)用super.onInterceptTouchEvent導(dǎo)致沒有對pointerIndex 進(jìn)行重新賦值。這個動作是在多點(diǎn)觸控后线罕,抬起部分手指(還有手指在屏幕上)的時候觸發(fā)的止潮。
問題解決
1.處理好case:MotionEvent.ACTION_POINTER_UP的操作
2.調(diào)用 super.onInterceptTouchEvent();更新poinerIndex狀態(tài)
3.重寫報(bào)錯的viewGroup 并try{}catch會出錯的onIntercepterTouchevent()方法
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}