タブレット(またはより具体的にはハニカム)でゲームがクラッシュする原因となるタッチイベントの例外があります...携帯電話でゲームが正常に動作し、実行していない人にこれが発生することを聞いていません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);
_
タブレットユーザーもゲームを利用できるようにしようとしているので、ヘルプ/アイデアは大歓迎です。ありがとう。
私の問題は、実際には2つのIDがないときにevent.getX(1)を実際に呼び出していたことです。したがって、event.getPointerCount()> = 2のidが2つあることを確認し、現在は動作するようにしました。たぶん、あなたは同じ運を持っているでしょう!
いくつかの不足している場合は、あなたが考えている指の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);
私もこのエラーを抱えていますが、私のポストワークの日前に解決策はありません。私のために働く唯一の一時的な疑似修正は、IllegalArgumentExceptionに対してtry-catchを使用することです。
Android Issue 1899 によると、ScaleGestureDetectorに関連しており、修正は数日前にコミットされています。
元の投稿では、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);
getPointerId()
をfindPointerIndex()
に変更するだけです。 geAction()
をgetActionMasked()
に変更する可能性があります。
それが役に立てば幸い!