2009-05-22 2 views
1

Я работаю над компонентом Flex, который можно изменить с помощью ручек справа и слева (то есть, если вы нажмете и перетащите левую сторону, компонент будет расти влево, если вы нажмете и перетащите вправо, он будет расти вправо).Объект Resize Flex/Flash с левой стороны?

Сейчас я использую:

var oldX:Number = this.x; 
this.x = event.stageX + (initial.x - initial.stageX); // Move the left edge to the left 
this.width += oldX - this.x; // Increase the width to compensate for the move to the left 

Но что делает правую сторону прыгать вокруг, и в целом выглядит некрасиво.

Что такое «право» на это? Есть ли что-то фундаментальное, что я ошибался?

Спасибо!

Редактировать: Дрожание происходит с правой стороны компонента. Когда я устанавливаю this.x, компонент перемещается влево, экран перерисовывается, затем ширина обновляется, и экран снова перерисовывается.

ответ

0

В зависимости от того, как у вас есть слушатели для настроенных ручек, проблема может заключаться в том, что код изменения размера вызывается снова и снова, потому что, когда вы устанавливаете новую позицию x для компонента, дескриптор будет перемещаться под курсором мыши чтобы снова вызвать код изменения размера и т. д.

+0

Я слушаю события мыши на 'stage', поэтому это не проблема компонента, перемещающегося под мышью. –

+0

Я обновил вопрос - см. ** редактировать **. –

1

Я не парень Flex, но я думаю, что ваш джиттер связан с каркасом Flex внутренне, используя Stage.invalidate() или какую-то такую ​​вещь, чтобы вызвать перерисовку во время выполнения кадра.

Я предполагаю, что, вероятно, «рамки» способ справиться с этой проблемой, но обходной путь, чтобы сделать ваши изменения в одной атомарной операции вы можете обновить преобразования объекта непосредственно, вдоль этих линий:

var dx:Number = // however you're finding this 
var m:Matrix = new Matrix(); 
m.scale(scaleX*(width-dx)/width, scaleY); 
m.translate(x+dx, y); 
transform.matrix = m; 

Это должно работать для простой графики, но я не уверен, будет ли он работать с компонентом, который, вероятно, должен поймать события, которые были изменены и перерисовываются. Я думаю, что это единственный способ сделать ваше обновление атомарным, поэтому, если что-то по этим линиям не поможет, вам понадобится ответ от кого-то большего на фреймворк.

+0

Хмм, это похоже на то, что я хочу ... Кроме того, когда я масштабируюсь, все дочерние элементы компонента также масштабируются (что не то, что я хочу). –

+0

Например, компонент изменен с [| ----- | ] to [| - |], когда я хочу: [| - | ] (если это имеет смысл) –

+0

Вам придется играть со спецификой - это будет зависеть от того, имеет ли значение, которое вы изменяете, с его содержанием, и так далее. Я просто имел в виду это как руководство, которое, непосредственно подталкивая преобразование, можно обновить положение и масштаб за один шаг. – fenomas

1

У той же проблемы.

Проблема в том, что сцена недостаточно освежающая.

Просто добавьте stage.invalidate(); после ваших 2 заданий ...

Смежные вопросы