У меня есть приложение 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» означает только левый край и т. Д. И т. Д.
Когда изменение размера начинается с «нормальной» позиции, т.е.верхний левый угол остается фиксированным, все отлично работает.Аналогично с фиксированным левым или верхним краем.Однако для нижнего и правого случаев мне нужно изменить положение элемента одновременно с изменением его размера, поскольку все координаты рассчитываются из верхнего левого угла.
Проблема, с которой я столкнулся, заключается в том, что когда это происходит, изменение размера происходит не плавно, оно продолжает слегка подпрыгивать вверх и вниз по мере изменения размера.Мало того, что когда вы изменяете размеры от «нормальных» ребер, положение курсора остается фиксированным относительно фиксированного ребра / угла, однако от одного из других ребер вы можете видеть, как он начинает отклоняться от ребра / угла при изменении размера.
С такими вещами легко получить + / - различных битов вычисления, запутанных, но так как изменение размера работает в правильном направлении каждый раз, я предполагаю, что они правильные.
Итак, вероятно, проблема заключается в одновременном перемещении и изменении размера, но я не могу найти обходной путь для этого.Любые мысли / предложения будут высоко ценится