mouseOver и mouseOut при изменении размера холста - PullRequest
0 голосов
/ 08 июня 2011

Я строю графический компонент в MXML, который имеет разные состояния, каждое из которых имеет свой собственный размер.

У меня есть "нормальное" состояние и "выделенное состояние", причем выделенный имеет большую высоту.

В этих компонентах я реализовал функцию, которая должна выполняться для каждого mouseOver и mouseOut для перехода из нормального состояния в выделенное состояние и обратно.

Моя проблема в выделенном режиме заключается в наведении мышисобытие запускается в соответствии с размером нормального состояния.

Вот код:

<mx:Canvas xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:mx="library://ns.adobe.com/flex/mx"
       xmlns:controller="com.*"

       mouseOver="mouseOverHandler(event)" mouseOut="mouseOutHandler(event)"
       width="230" height.Playing="40" height.Normal="21" height.Highlighted="40">
<mx:states>
    <mx:State name="Normal" />
    <mx:State name="Playing" />
    <mx:State name="Highlighted" />
</mx:states>
<mx:Button includeIn="Highlighted" left="19" bottom="2" width="15" height="15" />
</mx:Canvas>

Что-то не так в том, как я использую mouseOuver и mouseOut?

Спасибо,

Александр

1 Ответ

1 голос
/ 08 июня 2011

Я строю графический компонент в MXML с различными состояниями, каждый из которых имеет свой собственный размер.

Вы неправильно понимаете, как работает архитектура компонентов Flex.Компонент никогда не измеряет себя.Это всегда до родителей, чтобы измерить это дети.Вы можете переопределить метод меры, чтобы установить measureWidth и measureHeight;однако это только предложения, предоставленные родителю компонента.Компонент сам решает, принимать их или нет.

Итак, в вашем примере вы можете изменить высоту / ширину кнопки (дочерний элемент);но вы не можете изменить высоту / ширину холста (компонент, который вы расширяете) и ожидать его прилипания.

Не видя код, содержащий этот компонент холста, трудно точно сказать, что происходитна.Но, в этом случае, вы должны переопределить метод меры, чтобы изменить измеренную ширину / измеренную высоту.Примерно так:

override protected measure():void{
 if(currentState=='Normal'){
  measuredWidth = 0;
  measuredHeight = 0;
 } else {
  measuredWidth = button.width;
  measuredHeight = button.height;
 }
}

Когда состояние меняется, обязательно вызовите метод invalidateSize ().Вы можете сделать это, прослушивая событие currentStateChange .

Теоретически, это приведет к изменению компонента measureWWWW / measureHeight;который заставит родителя также перерисовать себя, приспосабливаясь к новому measureWidth / measureHeight.

MXML маскирует многие из этих деталей.

...