Каков тип данных из источника изображения - PullRequest
1 голос
/ 30 декабря 2011

еще один flashbreakder для меня ...

У меня есть класс с consttructor, который должен изменять только источник изображения.

    [Bindable]
    [Embed(source='../pictures/test.jpg')]
    private var _picture:Class; 

    public function Test(newSource:*****)
    {
        _picture.source = newSource;
    }

(изображение не является изображением, но класс, я знаю об этом, это должно быть так :-))

Проблема в том, что когда я вызываю конструктор, скажем:

var test:Test = new Test(pictureAtStage.source);

Flashbuilderвыдаст ошибку, потому что я не могу сказать компилятору, какой тип данных "newSource" в конструкторе будет иметь ...

* edit: Когда я использую _picture.source, встроенный источник, похоже, небыть измененным ...?

Кто-нибудь знает ответ?

Ответы [ 3 ]

1 голос
/ 30 декабря 2011

Мы говорим о mx.controls.Image? если это так, то источником изображения могут быть: класс, растровое изображение (не BitmapData), строка (в этом случае предполагается, что вы хотите загрузить его вместо использования встроенного). Если вы хотите найти общий знаменатель для всего этого, то Object - это тот класс, однако я бы предпочел ограничить его чем-то конкретным для вашего варианта использования.

Однако, если я могу что-то посоветовать ... не используйте mx.controls.Image, это слишком раздуто, даже для платформы Flex. Если это должен быть UIComponent - расширьте UIComponent и разрешите источнику иметь тип BitmapData - так вы сможете лучше управлять ресурсами - вы можете, например, повторно использовать то же самое фактическое изображение. Затем вы можете использовать graphics свойство элемента управления для отображения изображения.

Еще один совет, если вы все еще здесь :) Не используйте [Bindable], особенно его короткую версию, особенно не для частной переменной - вы избавите себя от разочарования в виде бесчисленных часов отладки ... Кроме того, в вашем случае вы не собираетесь изменять значение этой переменной в любом случае ...

Ты все еще здесь? Ну, не используйте [Embed] для переменных, используйте его для определения класса - немного больше работы для вас, но это, потенциально, сделает ваш код более переносимым. Если вы встраиваете класс, то компилятор не будет генерировать глупый класс «что-то-что-актив», он будет использовать Bitmap или BitmapData - в зависимости от того, какой класс расширяется. Таким образом, вы не будете вводить зависимость от платформы Flex и, как правило, будете иметь больший контроль над своим кодом.

РЕДАКТИРОВАТЬ: выше было написано, предполагая, что переменная _picture (class) и _picture (некоторая переменная, используемая в функции) не одно и то же. Но если это одно и то же, класс Class является динамическим, что означает, что вы можете добавлять к нему свойства во время выполнения (не знаю почему, это дизайнерское решение Adobe ...), однако компилятор действовать так, как будто это невозможно, поэтому вы можете обойти это, добавив свойство через отражение:

var _picture:Class = Sprite;
_picture["source"] = whatever;
trace(Sprite["source"]);
1 голос
/ 30 декабря 2011

Так как я очень новичок во flashbuilder, я не видел очевидных решений ...

Решение для первой части моего вопроса (до редактирования): установка типа данных для Object сделалахитрость:

[Bindable]
[Embed(source='../pictures/test.jpg')]
private var _picture:Class; 

public function Test(newSource:Object)
{
    _pucture.source = newSource;
}
1 голос
/ 30 декабря 2011

Это действительно немного сбивает с толку, это будет тип BitmapAsset, который расширяет Bitmap. Так что любой из них будет работать.

...