2009-05-22 66 views
1

我正在使用Flex組件,可以使用右側和左側的手柄調整大小(即,如果單擊並拖動左側,組件將向左增大,如果單擊並拖動右側,它會增長到右邊)。從左側調整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`上的鼠標事件,所以它不是組件在鼠標下移動的問題。 – 2009-05-22 22:25:30

+0

我更新了問題 - 請參閱**編輯**。 – 2009-05-22 22:25:49

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; 

這應該適用於簡單的圖形,但我不確定它是否適用於可能需要捕獲維度已更改並重繪本身的事件的組件。我認爲這是讓你的更新成爲原子化的唯一方法,所以如果沿着這些方向行不通,那麼你需要從框架上的某個人那裏得到答案。

1

有同樣的問題。

問題是舞臺不夠清爽。

只需添加stage.invalidate();在你的2個作業之後...