Не удается получить последнюю позицию указателя в событии onTouch в Android - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь получить последнее положение указателя на событии onTouch в Android. Мой объект - попытаться нарисовать линию между первой точкой и последней точкой для примера, я могу отслеживать и рисовать движение указателя. Тем не менее, я не могу нарисовать линию. Я попытался получить положение указателя в ACTION_POINTER_UP, однако я вижу, что положение указателя такое же. Я прочитал некоторые решения на различных форумах и увидел советы по отслеживанию позиции в ACTION_MOVE, а затем занял последнюю сохраненную позицию. Кажется, логика c, и я пробовал это так, но всегда одно и то же, я могу нарисовать движение указателя, но не могу отследить позицию в конкретный c момент. Это кажется очень странным. Кто-нибудь, помогите мне, пожалуйста, может быть, я делаю какую-то глупость в своем коде, которую я не узнаю. Вот мой код

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

1 Ответ

0 голосов
/ 08 февраля 2020

Я нашел ответ на свой вопрос. Я допустил ошибку при попытке занять позицию последнего указателя. Ответ: event.get (pointerId) возвращает последнюю позицию указателя.

...