Как реализовать манипуляции с фигурами на холсте для рисования? - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть вектор (_storedShapes) для хранения нарисованных прямоугольников (_rect). Я также планирую добавить эллипсы. То, что я пытаюсь сделать, - это добавить форму к месту на экране, которое я нажимаю, и иметь возможность изменить его размер. Вот сайт с демонстрацией того, что я пытаюсь сделать http://code.google.com/p/tangram-canvas/downloads/detail?name=TangramCanvas-1.2.zip.

Единственное отличие от этой демонстрации состоит в том, что я хочу, чтобы моя фигура расширялась со всех сторон от ее центра при перетаскивании.

Из моего кода прямо сейчас на холсте появляется прямоугольник предварительно заданного размера, где я нажимаю, а затем при перетаскивании просто следует за курсором на экране.

private class DrawSListener extends MouseAdapter {

    public void mousePressed(MouseEvent e) {
        _preX = (int) (_rect.getX() - e.getX());
        _preY = (int) (_rect.getY() - e.getY());
        DrawingPanel dp = new DrawingPanel();
        _rect = new SketchyRectangle(dp);
        System.out.println("new rec");

    //  if (_rect.contains(e.getPoint())) {
            _rect.setLocation(e.getX(), e.getY());
            System.out.println("setLocation");
            repaint();
            System.out.println("paint");
        //} 
    }
}

/**
 * Private class DrawListener is called when the DrawEllipse or DrawRectangle radio buttons are selected. 
 *
 */

private class DrawListener implements MouseMotionListener {

    public void mouseDragged(MouseEvent e) {
        if (_rect.contains(e.getPoint())) {
            _rect.setLocation(_preX, _preY);
            _storedShapes.add(_rect);
            repaint();
        }
    }
    @Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub  
    }
}

1 Ответ

0 голосов
/ 02 декабря 2011

Я бы сохранил две координаты в объекте (или там, где это имеет смысл): prevDragCoord, shapeCenter. По щелчку мыши сохраните координаты события в обоих членах. При перетаскивании мыши обновите размер прямоугольника, добавив к нему разницу текущей координаты события за вычетом координаты, хранящейся в объекте. Установите местоположение прямоугольника, установив разницу между элементом shapeCenter и размером прямоугольника, деленным на 2 (например, shapeCenter.x - rect.xLength / 2). Сохраните текущую координату в координатном элементе объекта, чтобы она могла обновляться при любых последующих вызовах вашего обработчика.

Я оставлю реализацию до вас. Может быть, вы можете сделать это только с одной переменной, или, возможно, без переменных, потому что объект события имеет какие-то потрясающие данные, чтобы сделать это. В любом случае, это должно быть общей идеей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...