android.view.MotionEvent event = ...;
for(int i = 0, n = event.getPointerCount(); i < n; i++)
{
handleTouch(event.getPointerId(i), event.getX(i), event.getY(i));
}
偶爾拋出IllegalArgumentException
:
09-03 19:43:21.996 E/AndroidRuntime(9484): FATAL EXCEPTION: GLThread 732
09-03 19:43:21.996 E/AndroidRuntime(9484): java.lang.IllegalArgumentException: pointerIndex out of range
09-03 19:43:21.996 E/AndroidRuntime(9484): at android.view.MotionEvent.nativeGetPointerId(Native Method)
09-03 19:43:21.996 E/AndroidRuntime(9484): at android.view.MotionEvent.getPointerId(MotionEvent.java:1927)
這似乎很不可能的,因爲getPointerId
在案,以0 getPointerCount()-1
採取指數(見the documentation )。
,我所知道這樣做的唯一奇怪的是,我用GLSurfaceView.queueEvent
到MotionEvent
傳遞給GL表面的渲染線程處理:
public boolean onTouchEvent(final MotionEvent event)
{
queueEvent(new Runnable() {
public void run() {
worker.handleTouchEvent(event);
}
});
return true;
}
我得到一個對象的引用,我認爲應該是不可變的,我認爲我安全地將它傳遞給另一個線程進行處理,在那裏我只進行只讀訪問。
我因此移動訪問實際MotionEvent對象到UI線程的代碼,但因爲只有極少發生的問題,我不知道我是否真正解決了這一問題,直到應用船舶。
問題:什麼是真的錯了嗎?
後續問題:假設這與我使用多線程做,如何做我安全的MotionEvent發送到另一個線程?
編號findPointerIndex正好與getPointerId相反。因此,event.findPointerIndex(event.getPointerId(i))== i。 – wolfgang