web-dev-qa-db-ja.com

pointerIndex out of range Android multitouch

タブレット(またはより具体的にはハニカム)でゲームがクラッシュする原因となるタッチイベントの例外があります...携帯電話でゲームが正常に動作し、実行していない人にこれが発生することを聞いていませんAndroid 3.0以降。関連するログ情報は次のとおりです...

_E/AndroidRuntime(26487): Java.lang.IllegalArgumentException: pointerIndex out of range
E/AndroidRuntime(26487):    at Android.view.MotionEvent.nativeGetAxisValue(Native Method)
E/AndroidRuntime(26487):    at Android.view.MotionEvent.getX(MotionEvent.Java:1549)
E/AndroidRuntime(26487):    at kieran.Android.asteroids.GameUI.onTouchEvent(GameUI.Java:665)
E/AndroidRuntime(26487):    at Android.view.View.dispatchTouchEvent(View.Java:4616)
E/AndroidRuntime(26487):    at Android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.Java:1560)
E/AndroidRuntime(26487):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:1291)
E/AndroidRuntime(26487):    at Android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.Java:1560)
E/AndroidRuntime(26487):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:1291)
E/AndroidRuntime(26487):    at Android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.Java:1560)
E/AndroidRuntime(26487):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:1291)
_

...そして、これがそれを呼び出しているコードです。私には申し分ないようですが、ハニカムにはまだ修正されていないバグがあるのでしょうか?上記のログの行番号665は、float x = event.getX(id);行に対応しています。多分which変数を取得する方法と関係があるはずです。しかし、それはphones/2.3以下で正常に動作します...

_int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;

if(actionCode == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_UP) {
    int which = action >> MotionEvent.ACTION_POINTER_ID_SHIFT;
    int id = event.getPointerId(which);
    float x = event.getX(id);
    float y = event.getY(id);
_

タブレットユーザーもゲームを利用できるようにしようとしているので、ヘルプ/アイデアは大歓迎です。ありがとう。

30
DRiFTy

私の問題は、実際には2つのIDがないときにevent.getX(1)を実際に呼び出していたことです。したがって、event.getPointerCount()> = 2のidが2つあることを確認し、現在は動作するようにしました。たぶん、あなたは同じ運を持っているでしょう!

49
Millec8

いくつかの不足している場合は、あなたが考えている指のIDに技術的にアクセスしていないため、マスクをポインターに適用する必要があります

int action = event.getAction() & MotionEvent.ACTION_MASK;     
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
int pointerId = event.getPointerId(pointerIndex);
7
Chris

私もこのエラーを抱えていますが、私のポストワークの日前に解決策はありません。私のために働く唯一の一時的な疑似修正は、IllegalArgumentExceptionに対してtry-catchを使用することです。

Android Issue 1899 によると、ScaleGestureDetectorに関連しており、修正は数日前にコミットされています。

2
Aladin Q

元の投稿では、getXおよびgetYがポインターインデックスを使用するときにポインターIDを使用しています。

IDとインデックスが両方とも0であるため、シングルタッチのIDを使用すると機能するように見えます。インデックスcanが変更されるため、マルチタッチを使用すると混乱します。

例:

1下をタッチします。
Touch 1 State Index = 0。 ID = 0

2 Downをタッチします。
Touch 1 State Index = 0。 ID = 0
Touch 2 State Index = 1。 ID = 1

1リリースをタッチします。
Touch 2 State Index =。 ID = 1

次のコードを試してください:

final int action = e.getAction();       
final int pointerIndex =(action & MotionEvent.ACTION_POINTER_INDEX_MASK) 
                >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;      
float x = event.getX(pointerIndex);
float y = event.getY(pointerIndex);
1
David Fleming

getPointerId()findPointerIndex()に変更するだけです。 geAction()getActionMasked()に変更する可能性があります。

それが役に立てば幸い!

1
blackjack102