Search code examples
androidpointerspositionontouch

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


I'm trying to get the last Position of Pointer on onTouch event in Android. My objectif is try to draw a Line between the first Point and the last Point for exemple, i can track and draw the movement of pointer. However, i can't draw a Line. I tried get Position of Pointer in ACTION_POINTER_UP, however, i see that the position of Pointer is the same. I read some solutions on different kind of forums and saw the advices to track position in ACTION_MOVE then take the last position saved. It seems logic and I tried it this way, but always the same, i can draw the movement of Pointer but can not track the position at a specific moment. It seems extremely bizzare. Anyone help me please, maybe i do some stupid thing in my code that i don't recognize it. Here is my code

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;
}

That is onTouchEvent method. And here is onDraw() method

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);
}

Solution

  • I have found the answer to my question. I have maked a mistake when trying to take the position of last pointer. The answer is event.get(pointerId) return the last position of pointer.