无法在 Android 的 onTouch 事件中获取指针的最后位置

Can not get the last position of pointer in onTouch event in Android

我正在尝试获取 Android 中 onTouch 事件中指针的最后位置。 我的目标是尝试在第一个点和最后一个点之间画一条线,例如,我可以跟踪和绘制指针的移动。但是,我不能画线。 我尝试在 ACTION_POINTER_UP 中获取指针的位置,但是,我看到指针的位置是相同的。 我在不同类型的论坛上阅读了一些解决方案,并看到了在 ACTION_MOVE 中跟踪位置的建议,然后采用最后保存的位置。这似乎是合乎逻辑的,我以这种方式尝试过,但总是一样,我可以绘制指针的运动但无法跟踪特定时刻的位置。显得格外诡异。 请任何人帮助我,也许我在我的代码中做了一些我不认识的愚蠢的事情。 这是我的代码

public boolean onTouchEvent(MotionEvent event){
    //get Pointer index from the event object
    int pointerIndex = event.getActionIndex();
    //get Pointer ID
    int pointerID = event.getPointerId(pointerIndex);
    //get masked (not specific to a pointer) action
    int maskedAction = event.getActionMasked();

    switch(maskedAction){
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:{
            //We have new pointer. Let add it to the list of Pointers
            PointF f = new PointF();
            f.x = event.getX(pointerIndex);
            f.y = event.getY(pointerIndex);
            Path path_cur = paths.get(pointerID);
            if (path_cur==null) path_cur= new Path();
            path_cur.moveTo(f.x,f.y);
            mActivePointers.put(pointerID,f);
            paths.put(pointerID,path_cur);
            break;
        }
        case MotionEvent.ACTION_MOVE:{
            //a Pointer was moved
            for (int size = event.getPointerCount(),i =0;i<size;i++){
                PointF point = mActivePointers.get(event.getPointerId(i));
                Path path_cur = paths.get(event.getPointerId(i));
                if (point!=null){
                    PointF pointTemp = new PointF();
                    pointTemp.x = event.getX(i);
                    pointTemp.y = event.getY(i);
                    path_cur.lineTo(pointTemp.x,pointTemp.y);
                    testPointers.put(event.getPointerId(i),pointTemp);
                    Log.d("teoleo","Come here already");
                }
            }
            break;
        }
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:{
            PointF pointDown = new PointF();
            pointDown.x = event.getX(pointerIndex);
            pointDown.y = event.getY(pointerIndex);
            PointF pointUp = testPointers.get(pointerID);
            Toast.makeText(this.getContext(),"First coordinate is "+ pointUp.x +" and" + pointUp.y + "second one is "
                    +pointDown.x+"and "+pointDown.y,Toast.LENGTH_LONG).show();
            ArrayList <PointF> tempList = new ArrayList<>();
            tempList.add(pointDown);
            tempList.add(pointUp);
            listDrawLine.add(tempList);
            mActivePointers.remove(pointerID);
            break;
        }
        case MotionEvent.ACTION_CANCEL:{
            mActivePointers.remove(pointerID);
            break;
        }
    }
    invalidate();
    return true;
}

也就是onTouchEvent方法。这是 onDraw() 方法

protected void onDraw(Canvas canvas){
    super.onDraw(canvas);

    //draw all pointers
    for (int size =mActivePointers.size(),i=0;i<size;i++){
        PointF point =mActivePointers.valueAt(i);
        if (point!=null) {
            mPaint.setColor(colors[i % 9]);
            canvas.drawCircle(point.x, point.y, SIZE, mPaint);
        }
    }
    for (int size = paths.size(),i=0;i<size;i++){
        Path path = paths.valueAt(i);
        if (path!=null){
            mPaint.setColor(colors[i % 9]);
            canvas.drawPath(path,mPaint);
        }
    }
    for (ArrayList<PointF> list:listDrawLine){
        PointF pointDown = list.get(0);
        PointF pointUp = list.get(1);
        //Toast.makeText(this.getContext(),"trong day la "+ pointUp.x +" va" + pointUp.y + "them diem "
        //        +pointDown.x+"va "+pointDown.y,Toast.LENGTH_LONG).show();
        Paint gPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        gPaint.setColor(Color.RED);
        gPaint.setStyle(Paint.Style.STROKE);
        canvas.drawLine(pointDown.x,pointDown.y,pointUp.x,pointUp.y,gPaint);

    }
    canvas.drawText("Total Pointers: "+mActivePointers.size(),10,40,textPaint);
}

我找到了问题的答案。我在试图占据最后一个指针的位置时犯了一个错误。答案是event.get(pointerId) return指针的最后位置。