Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android多点触控指针索引超出范围_Android_Multi Touch - Fatal编程技术网

Android多点触控指针索引超出范围

Android多点触控指针索引超出范围,android,multi-touch,Android,Multi Touch,本书中的代码:。 起初我用两个手指触摸屏幕——一切正常。 然后用一根手指触摸屏幕-java.lang.IllegalArgumentException:pointerIndex超出范围 public boolean onTouch(View v, MotionEvent event) { int action = event.getActionMasked(); int idx; int n; switch (action) { case Moti

本书中的代码:。 起初我用两个手指触摸屏幕——一切正常。 然后用一根手指触摸屏幕-java.lang.IllegalArgumentException:pointerIndex超出范围

public boolean onTouch(View v, MotionEvent event) {
    int action = event.getActionMasked();
    int idx;
    int n;
    switch (action) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:
            idx = MotionEventCompat.getActionIndex(event);
            tracks.add(event.getPointerId(idx));
            break;
        case MotionEvent.ACTION_POINTER_UP:
            idx = MotionEventCompat.getActionIndex(event);
            tracks.remove(event.getPointerId(idx));
            break;
        case MotionEvent.ACTION_MOVE:
            n = event.getHistorySize();
            for (Integer i : tracks) {
                idx = event.findPointerIndex(i.intValue());
                for (int j = 0; j < n; j++) {
                    addDot(
                            dots,
                            event.getHistoricalX(idx, j),
                            event.getHistoricalY(idx, j),
                            event.getHistoricalPressure(idx, j),
                            event.getHistoricalSize(idx, j)
                    );
                }
            }
            break;
        default:
            return false;
    }
    for (Integer i: tracks){
        idx = event.findPointerIndex(i.intValue());
        addDot(
                dots,
                event.getX(idx),
                event.getY(idx),
                event.getPressure(idx),
                event.getSize(idx)
        );
    }
    return true;
}
public boolean onTouch(视图v,运动事件){
int action=event.getActionMasked();
int-idx;
int n;
开关(动作){
case MotionEvent.ACTION\u DOWN:
case MotionEvent.ACTION\u指针\u向下:
idx=MotionEventCompat.getActionIndex(事件);
tracks.add(event.getPointerId(idx));
打破
case MotionEvent.ACTION\u指针\u向上:
idx=MotionEventCompat.getActionIndex(事件);
tracks.remove(event.getPointerId(idx));
打破
case MotionEvent.ACTION\u移动:
n=event.getHistorySize();
对于(整数i:轨迹){
idx=event.findPointerIndex(i.intValue());
对于(int j=0;j
方法findPointerIndex()可能返回-1。根据我的经验,当你用两个手指(或更多)触摸并放开第一个被按下的手指时,就会发生这种情况。 我认为这是“pointerIndex超出范围”错误的原因-因为-1不是有效的索引:-)

对于动作,我建议使用一个带有getPointerCount()的循环,即从0循环到getPointerCount()-1。 使用此方法,您可以使用getX(手指)和getY(手指)获得触摸位置。 其中“finger”是循环计数。 使用此方法将无法跟踪您的手指的ID,即如果您用两个手指按压并松开第一个手指(ID=0),则第二个手指将继续作为第一个手指(现在未按压)

希望这有帮助! /理查德