Доступ к <mx: Image> из класса AS - PullRequest
0 голосов
/ 14 апреля 2011

Я хочу нарисовать что-то на <mx:Image>, который есть в моем файле .mxml, но я хочу сохранить свою реализацию рисования в отдельном классе AS.

Как я могу получить доступ к своему классу рисования AS в моем .mxml?

Ответы [ 4 ]

1 голос
/ 15 апреля 2011

Я думаю, что вы спрашиваете, как сохранить ваши файлы ActionScript отдельно от файлов MXML, которые содержат ваши проекты. Ответ прост:

Создайте файл Actionscript. Включите в этот файл только методы и не переносите код в определение package или class. Файл должен выглядеть следующим образом:

import mx.controls.Alert;

// ActionScript file
/**
 *
 * Created By jviers
 * Created on Apr 14, 2011
 * 
 *
 */

public function hello():Alert{
    Alert.show("Hello World!");
}

Создайте свой MXML-файл, содержащий ваши компоненты «Design». Создайте элемент Script в этом mxml-файле и установите в качестве источника относительный путь к вашему файлу ActionScript. MXML должен выглядеть следующим образом:

<?xml version = "1.0" encoding = "utf-8"?>
<s:Application xmlns:fx = "http://ns.adobe.com/mxml/2009"
               xmlns:s = "library://ns.adobe.com/flex/spark"
               xmlns:mx = "library://ns.adobe.com/flex/mx"
               minWidth = "955"
               minHeight = "600">

    <fx:Script>
        <![CDATA[
            protected function button1_clickHandler ( event : MouseEvent ) : void {
                // TODO Auto-generated method stub
                hello ();
            }
        ]]>
    </fx:Script>

    <fx:Declarations>

        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script source = "./scratch/MyFile.as" />

    <s:Button label = "Show Alert" click = "button1_clickHandler(event)" />
</s:Application>

Вы заметите, что ActionScript в scratch.MyFile.as выполняется при запуске приложения.

Вы можете использовать этот метод для включения вашей логики рисования в ваше приложение. Внешний ActionScript обрабатывается так, как если бы это были определения методов для класса, сгенерированного MXML.

Позвольте мне предупредить вас, прежде чем все перепрыгнут через меня. Это НЕ лучшая практика. Существуют конкретные варианты использования этой функции Flex. Прежде чем я подойду к ним, позвольте мне объяснить, почему ваше представление об отделении «логики» от вашего «взгляда» неверно.

Файлы Flex MXML не являются кодом только для просмотра. Это декларативный диалект, который упрощает определения классов ActionScript. Когда проект Flex компилируется с использованием mxmlc или compc (это программы компиляции для приложений flex и библиотек компонентов соответственно), файлы MXML предварительно компилируются в определения классов ActionScript. Если вы добавите директиву -keep-generated-actionscript в параметры компилятора в команде компиляции Flash / Flex Builder / Ant / из командной строки, компилятор оставит сгенерированные классы, составляющие класс ActionScript, полученные из деклассивных файлов MXML в вашем проекте. Таким образом, файл MXML становится классом.

Определение ActionScript в блоке Script в вашем MXML равно НЕ , смешивающему «логику» с «представлением». Аналогично, MXML NOT определяет презентацию вашего проекта. Это просто декларативное подмножество языка ActionScript, упрощающее определение классов представления. В качестве доказательства вы можете определить ArrayCollections , Strings и Vectors в MXML. Эти классы являются контейнерами данных и не имеют абсолютно никакого отношения к представлению.

Итак, причина, по которой все ваши ActionScript помещаются во внешние файлы, заключается в том, что не очень хорошая вещь в том, что это делает поддержку вашего проекта головной болью. Мало того, что кто-то должен искать ваш компонент, определенный в MXML, теперь он должен искать кодовую базу, чтобы найти скрипт с именем Logic.as, относительно определенный для вашего компонента.

Варианты использования, в которых используется внешний ActionScript через Script.source, следующие:

  1. Группа предопределенных методов / свойств используется во многих компонентах без изменений. Вместо того чтобы копировать и вставлять эти методы в каждый компонент, вы используете свойство Script.source, чтобы один раз определить методы и ссылаться на них во всем приложении.
  2. Аналогично, но отличается от варианта использования-1: Вам требуется дополнение.Как и интерфейс, смешивание представляет собой набор методов, которые должны быть определены для работы компонента, и эти методы должны быть многократно используемыми и определять явные входные параметры и выходные параметры.В отличие от интерфейса, эти методы могут иметь любой тип пространства имен: защищенное, окончательное, общедоступное, внутреннее, mx_internal и т. Д. И могут выполнять функции тел, то есть иметь код внутри функционального блока {}.Для примера «смешивания» представьте перечислимый объект, объект, который имеет методы next (), previous (), reset () и iterator ().Когда вы хотите выполнить итерацию по свойствам объекта, вы вызываете iterator (), который возвращает объект итератора, который вызывает next () и previous () для извлечения следующих и предыдущих значений свойств из объекта.Вы можете смешивать эту функциональность со всеми видами объектов и использовать их с пользой.Кроме того, ваша включенная функциональность заключена в классы, в которые она включена.Она работает как директива включения в AS3.

Надеюсь, это поможет вам как понять, что такое "логика" и "презентация" во Flex, так и решить вашу конкретную проблему.

1 голос
/ 14 апреля 2011

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

…
<mx:Script>
<![CDATA[
public function getImage():Image
{
    return myImage;
}
]]>
</mx:Script>
<mx:Image id="myImage" />
…

Насколько вы можете ссылаться на свой MXML из AS, вы можете вызывать этот метод.

1 голос
/ 14 апреля 2011

Если вы хотите нарисовать что-то на изображении, используя свой собственный класс рисования, я предлагаю вам добавить его в конструктор вашего класса рисования, например так:

/*********************************************
* Variables
*********************************************/
private var _myImageIWantToDrawIn:Image;

/*********************************************
*   Properties
*********************************************/
public function set image(value:Image):void
{
    _myImageIWantToDrawIn = value;
}

public function get image():Image
{
    return _myImageIWantToDrawIn;
}

/*********************************************
* Constructor
*********************************************/
public function myDrawingclass(imageYouWantToDrawIn:Image)
{
    _myImageIWantToDrawIn = imageYouWantToDrawIn;   
}

вот так, вы всегда можетеполучите доступ к изображению из этого класса и нарисуйте его, если хотите.(Вы также можете получить доступ к _myImageIWantToDrawIn.graphics, если хотите рисовать программно).Вы можете добавить свойства, если вы хотите изменить изображение во время выполнения.тогда вы можете просто сказать: myDrawingclass.image = imageYouWantToDrawIn;

edit: этот предыдущий ответ был фактически противоположен тому, что вы спрашиваете, но я думаю, что это будет хорошо для того, что вы хотели бы сделать.Если вы хотите получить доступ к своему классу as, просто создайте экземпляр своего класса и добавьте к нему открытые методы вместо частных.

1 голос
/ 14 апреля 2011

Я думаю, что у вас это задом наперед. Если вы включите файл .as в .mxml с помощью тега <mx:script>, вы сможете увидеть определенную в нем функцию. Чтобы обратиться к изображению, установите для него атрибут id. С этого момента он становится адресуемым, как если бы он был определен с использованием ActiveScript, например

 var image:Image = new Image()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...