Запишите и сохраните путь изогнутой формы

Я хотел бы записать ввод пользователя в мое приложение для рисования. Он может рисовать все, что захочет, а не только форму с прямой линией. Как я могу записать в один путь все движения, которые делает пользователь, когда рисует, например, конкретный круг? Это мой метод, где есть System.out.println(), где я бы подтолкнул метод, чтобы сохранить путь.

    public boolean onTouchEvent(MotionEvent event) {
        float touchX = event.getX();
        float touchY = event.getY();
        //respond to down, move and up events
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                drawPath.moveTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_MOVE:
                drawPath.lineTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_UP:
                drawPath.lineTo(touchX, touchY);
                System.out.println(touchX +", " +touchY);
                drawCanvas.drawPath(drawPath, drawPaint);
                drawPath.reset();
                break;
            default:
                return false;
        }
        //redraw
        invalidate();
        return true;
    }```

person Babbara    schedule 23.07.2019    source источник
comment
Почему бы просто не сохранить точки (x, y) и «перерисовать» их позже, когда это необходимо? (Или это то, о чем вы просите помощи?)   -  person Chrisvin Jem    schedule 23.07.2019
comment
Если я сохраню только точки X и Y, будет ли отображаться только прямая линия? Это всего 2 точки, и мне нужно нарисовать все возможные формы, которые хочет пользователь, а не только геометрические.   -  person Babbara    schedule 23.07.2019


Ответы (1)


Просто сохраните точки (x,y) и «перерисуйте» их позже, когда это необходимо.

Под (x,y) я подразумеваю значения event getX и getY. Сохраните все значения в ArrayList, а затем вы сможете использовать сохраненные значения для перерисовки фигуры. В основном, я предлагаю вам сделать что-то вроде следующих строк,

Создать массив точек

ArrayList<Pair<Float,Float>> points = new ArrayList<>();

Сохранять точки взаимодействия в массиве

public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();
    //respond to down, move and up events
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            drawPath.moveTo(touchX, touchY);
            points.add(new Pair<Float, Float>(touchX, touchY));
            break;
        case MotionEvent.ACTION_MOVE:
            drawPath.lineTo(touchX, touchY);
            points.add(new Pair<Float, Float>(touchX, touchY));
            break;
        case MotionEvent.ACTION_UP:
            drawPath.lineTo(touchX, touchY);
            System.out.println(touchX +", " +touchY);

            points.add(new Pair<Float, Float>(touchX, touchY));
            //At this point you might want to
            //store this array somewhere 
            //so you can use it to redraw later if needed

            drawCanvas.drawPath(drawPath, drawPaint);
            drawPath.reset();
            break;
        default:
            return false;
    }
    //redraw
    invalidate();
    return true;
}

Можно использовать массив для перерисовки фигуры при необходимости

public void drawFromArrayList(ArrayList<Pair<Float,Float>> points) {
    int pointCount = points.size();
    if (pointCount < 2) {
        return;
    }
    for (int i=0;i<pointCount;i++) {
        float touchX = points.get(i).first, touchY = points.get(i).second;
        if(i==0) {
            drawPath.moveTo(touchX, touchY);
        }
        drawPath.lineTo(touchX, touchY);
        if(i==pointCount-1) {
            drawCanvas.drawPath(drawPath, drawPaint);
            drawPath.reset();
        }
    }
}
person Chrisvin Jem    schedule 23.07.2019