Как разрешить пользователю плавно изменять размеры элементов в Flex 3 - PullRequest
0 голосов
/ 28 июня 2011

У меня есть приложение Flex 3, в котором есть элементы, которые пользователь может добавить на основной холст, а затем изменить его размер и изменить положение.

Для изменения размера я использую 3 ключевые функции:

Когда начинается изменение размера:

        private function startResize(event:MouseEvent):void
        {
            RESIZE_START_MOUSE_X = event.localX;
            RESIZE_START_MOUSE_Y = event.localY;

            RESIZE_START_WIDTH = this.width;
            RESIZE_START_HEIGHT = this.height;

            RESIZE_START_X = this.x;
            RESIZE_START_Y = this.y;

            RESIZE_BOUND = calculateResizeBound(event);

            addEventListener(MouseEvent.MOUSE_MOVE, resizeMouseHandler);

            isResizing = true;
        }

Когда изменение размера завершено:

        private function endResize():void
        {
            RESIZE_START_MOUSE_X = -1;
            RESIZE_START_MOUSE_Y = -1;

            RESIZE_START_WIDTH = this.width;
            RESIZE_START_HEIGHT = this.height;

            RESIZE_START_X = -1;
            RESIZE_START_Y = -1;

            RESIZE_BOUND = '';

            removeEventListener(MouseEvent.MOUSE_MOVE, resizeMouseHandler);

            isResizing = false;             
        }

Пока пользователь изменяет размеры:

        private function resizeMouseHandler(event:MouseEvent):void
        {
            var deltaX:Number = event.localX - RESIZE_START_MOUSE_X;
            var deltaY:Number = event.localY - RESIZE_START_MOUSE_Y;

            if (RESIZE_BOUND.indexOf('T') > -1)
            //We are fixing the top so move the bottom edge
            {
                this.height = RESIZE_START_HEIGHT + deltaY;
            }

            if (RESIZE_BOUND.indexOf('B') > -1)
            //We are fixing the bottom so move the top edge
            {
                this.y = RESIZE_START_Y + deltaY;
                this.height = RESIZE_START_HEIGHT - deltaY;
            }

            if (RESIZE_BOUND.indexOf('L') > -1)
            //We are fixing the left so move the right edge
            {
                this.width = RESIZE_START_WIDTH + deltaX;
            }

            if (RESIZE_BOUND.indexOf('R') > -1)
            //We are fixing the right so move the left edge
            {
                this.x = RESIZE_START_X + deltaX;
                this.width = RESIZE_START_WIDTH - deltaX;
            }

        }

Естьдругая функция, на которую ссылаются эти объекты, называется calcResizeBound ().Это возвращает строку, указывающую, какой край / угол должен оставаться неизменным во время изменения размера.Например, «TL» означает, что верхний левый угол должен оставаться фиксированным, «BR» означает нижний правый, «L» означает только левый край и т. Д. И т. Д.

Когда изменение размера начинается с «нормальной» позиции, т.е.верхний левый угол остается фиксированным, все отлично работает.Аналогично с фиксированным левым или верхним краем.Однако для нижнего и правого случаев мне нужно изменить положение элемента одновременно с изменением его размера, поскольку все координаты рассчитываются из верхнего левого угла.

Проблема, с которой я столкнулся, заключается в том, что когда это происходит, изменение размера происходит не плавно, оно продолжает слегка подпрыгивать вверх и вниз по мере изменения размера.Мало того, что когда вы изменяете размеры от «нормальных» ребер, положение курсора остается фиксированным относительно фиксированного ребра / угла, однако от одного из других ребер вы можете видеть, как он начинает отклоняться от ребра / угла при изменении размера.

С такими вещами легко получить + / - различных битов вычисления, запутанных, но так как изменение размера работает в правильном направлении каждый раз, я предполагаю, что они правильные.

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

1 Ответ

0 голосов
/ 28 июня 2011

Doug McCune имеет потрясающую оболочку Resize, которую можно использовать для изменения размеров элементов.Тогда вам просто нужно добавить двигатель на это.Смотрите сообщение в блоге для кода / образца: http://dougmccune.com/blog/2007/08/17/my-360flex-slides-and-code/

...