#flash #apache-flex
#flash #apache-flex
Вопрос:
Я перепишу этот вопрос, чтобы было понятнее.
Я пытаюсь получить файл класса из Flash в Builder.
Все в этом классе находится внутри спрайта с именем mainContainer
. Теперь я пытаюсь перенести этот `MainContainer’, который содержит графику для класса, в гибкое приложение.
Это оказывается проблемой, поскольку существует множество различных способов сделать это (похоже, по многочисленным поисковым запросам Google).
Сначала я объявляю MXML Canvas с изображением внутри него (как я читал, это сработало бы):
<mx:Canvas x="268" y="10" width="756" height="680" id="canvas">
<mx:Image id="spriteLayer" x="268" y="0" width="756" height="700" scaleContent="false" autoLoad="true">
</mx:Image>
</mx:Canvas>}
Хорошо, тогда мой план состоял в том, чтобы передать ссылку на изображение her of spriteLayer
классу, который я пытаюсь запустить:
импорт включает в себя.Спирограф; общедоступная переменная spiro:Spirograph = новый Spirograph(spriteLayer);
К сожалению, он всегда передается null
только в класс Spirograph:
функция Spirograph (canvasImage: Изображение): пустота { this.canvas = изображение холста; MainContainer.graphics.beginFill(0xFFFFFF); MainContainer.graphics.drawRect(290, 0, 670, 700); MainContainer.graphics.endFill(); ui.addChild(основной контейнер); canvas.addChild(пользовательский интерфейс); }
Не уверен, что делать.
Большое спасибо.
Комментарии:
1. приношу извинения за неправильное форматирование, кажется, подсветка кода SO сейчас не работает.
2. @ALEXW При форматировании кода используйте символ «фигурной скобки», а не символ «кавычки». Я переформатировал код в вашем сообщении. Я не уверен, была ли это временная проблема, если вы не знали; но, тем не менее, похоже, что теперь все в порядке.
3. Я не совсем понимаю, в чем проблема. В вашем вопросе, похоже, смешивается MXML с ActionScript, как если бы строки выполнялись четко синхронно; когда это невозможно. Если бы вы могли предоставить более подробный контекст или код, это могло бы помочь.
4. Я попробовал использовать символ фигурной скобки. :/ Также обновил q
5. надеюсь, теперь вопрос понятен?
Ответ №1:
Я думаю, вам нужно ознакомиться с жизненным циклом гибкого компонента. Скорее всего, компонент spriteLayer еще не создан или не инициализирован при вызове new Spirograph(spriteLayer)
кода. Когда вызывается этот код?
Жизненный цикл компонента Flex — это серия методов и событий, которые создают пользовательский интерфейс Flex. Вы можете переопределить эти методы или прослушать эти события, чтобы «что-то сделать». Canvas и spritelayer не будут созданы до тех пор, пока не будет вызван метод createChildren; а значения свойств по умолчанию определяются до того, как это произойдет.
Вы могли бы переопределить createChildren() и выполнить инициализацию там:
override protected function createChildren():void{
super.createChildren()
spiro = new Spirograph(spriteLayer);
}
или вы могли бы прослушать событие инициализации и установить там значение по умолчанию:
<mx:MyParentComponent initialize="onInitialize()">
<fx:Script>
protected function onInitialize():void{
spiro = new Spirograph(spriteLayer);
}
</fx:Script>
</mx:MyParentComponent>
Как прокомментировал другой участник, вы также могли бы выполнить инициализацию (как указано выше) в событии creationComplete , хотя я лично не рекомендовал бы этого делать. Событие creationComplete отправляется в самом конце жизненного цикла; и, скорее всего, вносимые вами изменения приведут к «перезапуску» события рендеринга, что приведет к повторному анализу большей части жизненного цикла; размер компонента будет изменен (measure()), а элементы перемещены (updateDisplayList()). Рекомендуется устанавливать значения по умолчанию как можно раньше в жизненном цикле.
Комментарии:
1. Это действительно помогло, очень помогло … один вопрос, как мне теперь ссылаться на методы в классе с помощью события Flex (нажатие кнопки). Мне нужна кнопка для запуска метода в экземпляре spiro… Очень признателен!
Ответ №2:
для flex 4 — использовать http://docs.huihoo.com/flex/4/spark/core/SpriteVisualElement.html
ваш sprite, если это пользовательский класс, расширяющий sprite, вместо этого расширит SpriteVisualElement. В противном случае просто поместите его в UIComponent, поскольку UIComponent поддерживает addchild , в то время как с ним можно обращаться в flex, как с обычным элементом управления flex (addElement) и т.д.
Пока, например, если этот спрайт встроен во flash swc с именем символа SpriteTest. В flex вы могли бы добавить его в другой компонент, такой как soo…
в mxml поместить UIComponent, присвоить ему идентификатор … скажем, ucSpriteHolder в скрипте, var mcMySprite:Sprite = new SpriteTest(); ucSpriteHolder.addChild(mcMySprite)
Комментарии:
1. Я не использую встроенный спрайт. Должен ли я быть? Могу ли я не просто использовать библиотеку классов? Я не использую никаких разработанных символов, это все код.
2. лучший и самый простой способ для вашего класса — расширить SpriteVisualElement. Затем вы можете работать с этим в Flex точно так же, как с любым другим компонентом flex.
3. Хорошо, спасибо за информацию, я понял, что мне не следует использовать Flex, в данном случае это неподходящий инструмент для работы. Пока придерживаюсь Flash-хаков 😉
Ответ №3:
если вы делаете это public var spiro:Spirograph = new Spirograph(spriteLayer);
прямо внутри <fx:Script>
тега, перемещение его в обработчик событий canvas creationComplete
должно помочь
Комментарии:
1. Событие Initialize — гораздо лучший выбор для его инициализации; и я объяснил, почему в моем ответе. Кажется, что большинство людей используют обработчик creationComplete в качестве переменной стиля «конструктор», хотя на самом деле это не так. В этом случае это, вероятно, заставит основные методы жизненного цикла выполняться снова, что не очень хорошо для эффективности.
2. @www.Flextras.com — я предпочитаю использовать
creationComplete
для случая, когда мне понадобится получить доступ к реальной ширине / высоте, рассчитанной внутри компонента. Однако, спасибо за комментарий, это полезная оптимизация для любого другого случая