ActionScript: правильное приведение растрового изображения к классу - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть экземпляр дерева, вызывающий iconFunction "getIconFromItem".

<mx:Tree dataProvider="{collection}" iconFunction="getIconFromItem" />

Функция getIconFromItem возвращает ноль, даже если растровое изображение не равно нулю.

    public function getIconFromItem(item:Object):Class {
    var result:Class = item.icon as Class ;
    return result ;
}

Установка точки останова в строке результата возврата показывает, что item.icon является растровым изображением, а результат равен нулю.

Есть ли идеи или указания относительно того, как успешно преобразовать растровое изображение в класс, чтобы растровое изображение возвращалось в виде значка?

Приветствия

Keith

Ответы [ 2 ]

3 голосов
/ 10 ноября 2011

Проблема здесь в том, что item.icon имеет тип Bitmap, который не расширен от типа Class, а от Object. Всякий раз, когда вы приводите тип, который не находится в иерархии типов объекта, возвращается null.

Вы хотите получить класс значка, который будет создан элементом управления деревом, а не сам значок, поэтому вам следует изменить свою функцию на

public function getIconFromItem(item:Object):Class {
     return item.icon.constructor as Class;
}
0 голосов
/ 10 ноября 2011

Проблема в том, что iconFunction ожидает класс. Каждое встроенное изображение имеет подкласс, автоматически генерируемый компилятором. Спасибо @weltraumpirat за указание в правильном направлении: -)

Целью было динамическое отображение значков в древовидном классе. Можно изменить класс, созданный Ben Stucki (http://blog.benstucki.net/?p=42), для работы с объектом TreeItemRenderer.data, но это не удалось, когда я создал пользовательский MXTreeItemRenderer.

Закончилось создание BitmapImage и пользовательского TreeItemRenderer, который использовал предопределенный атрибут iconBitmap внутри класса для динамической загрузки значков.

package components
{

    import flash.display.BitmapData;

    import mx.core.mx_internal;

    import spark.core.IContentLoader;
    import spark.primitives.BitmapImage;

    public class RuntimeBitmapImage extends BitmapImage
    {
        public function RuntimeBitmapImage()
        {
            super();
        }

        public function set bitmapData(bitmapData:BitmapData):void
        {
            super.setBitmapData(bitmapData, false);
        }

    }
}    



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

    <fx:Script>
        <![CDATA[


            override public function set data(value:Object):void {
                super.data = value;

                if ( value != null ) {

                    if ( value.iconBitmap != null ) {
                        runtimeBitmapImage.bitmapData = value.iconBitmap.bitmapData ;
                    }

                } 


            }

        ]]>
    </fx:Script>

    <s:states>
        <s:State name="normal" />            
        <s:State name="hovered" />
        <s:State name="selected" />
    </s:states>


    <s:HGroup left="0" right="0" top="0" bottom="0" paddingTop="2" verticalAlign="middle">
        <s:Rect id="indentationSpacer" width="{treeListData.indent}" percentHeight="100" alpha="0">
            <s:fill>
                <s:SolidColor color="0xFFFFFF" />
            </s:fill>
        </s:Rect>
        <potentiate:RuntimeBitmapImage id="runtimeBitmapImage" left="2" width="18" />
        <s:Label id="labelField" text="{treeListData.label}" paddingTop="2"/>
    </s:HGroup>

</s:MXTreeItemRenderer>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...