Использование MultiDPIBitmapSource с IconItemRenderer - тестовый пример и скриншот прилагаются

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

Снимок экрана:

введите описание изображения здесь

App.mxml (просто добавьте в пустой мобильный проект Flex в Flash Builder 4.7):

<?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" 
               applicationDPI="160">
    <fx:Declarations>
        <s:MultiDPIBitmapSource id="EN_ICON"
                source160dpi="@Embed('low-res/en_US.png')"
                source240dpi="@Embed('mid-res/en_US.png')"
                source320dpi="@Embed('high-res/en_US.png')"/>
        <s:MultiDPIBitmapSource id="RU_ICON"
                source160dpi="@Embed('low-res/ru_RU.png')"
                source240dpi="@Embed('mid-res/ru_RU.png')"
                source320dpi="@Embed('high-res/ru_RU.png')"/>
        <s:MultiDPIBitmapSource id="DE_ICON"
                source160dpi="@Embed('low-res/de_DE.png')"
                source240dpi="@Embed('mid-res/de_DE.png')"
                source320dpi="@Embed('high-res/de_DE.png')"/>
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            private const LANGUAGES:ArrayCollection = new ArrayCollection([
                { icon: EN_ICON, locale: 'en_US', label: 'English' },
                { icon: RU_ICON, locale: 'ru_RU', label: 'Русский' },
                { icon: DE_ICON, locale: 'de_DE', label: 'Deutsch' }
            ]);
        ]]>
    </fx:Script> 

    <s:List 
        width="100%" 
        height="100%"
        dataProvider="{LANGUAGES}">
        <s:itemRenderer>
            <fx:Component>
                <s:IconItemRenderer labelField="label" iconField="icon" />
            </fx:Component>
        </s:itemRenderer>
    </s:List>
</s:Application>

Значки (любезно предоставлены пользователем koppi @ openclipart.org и размещены в подкаталогах: src / low-res, src / mid-res, src / high-res):

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь


person Alexander Farber    schedule 03.06.2013    source источник


Ответы (2)


Проблема в том, что ваша коллекция массивов LANGUAGES создается до создания 3 MultiDPIBitmapSource объектов. Фактически, каждый элемент в dataProvider имеет null в поле icon.

Я не знаю, в какой момент жизненного цикла компонента будут созданы объекты в тегах <fx:Declarations>, но я знаю, что они должны быть созданы к моменту отправки события «creationComplete». Фактически, как подтвердил OP, объекты в теге объявлений уже были созданы при отправке события «инициализация».

Если вы создадите коллекцию массивов LANGUAGES в обработчике событий «creationComplete», она будет работать правильно.

person Sunil D.    schedule 04.06.2013
comment
+1; однако что-то не имеет смысла в этом ответе. Если переместить код настройки массива в обработчик инициализации, проблема была решена; тогда утверждение, что fx:Declarations не создается до тех пор, пока не будет creationComplete(), должно быть ложным. - person JeffryHouser; 04.06.2013
comment
@ Reboog711 Я хотел сказать, что знаю, что объекты в тегах объявлений будут созданы к моменту отправки события creationComplete. И, как выяснил ОП, эти объекты уже были созданы к моменту отправки события инициализации. Я отредактирую, чтобы прояснить эту часть, спасибо! - person Sunil D.; 04.06.2013

Я не совсем уверен, решит ли это вашу проблему, но всякий раз, когда я использую Embed, я использую его так:

@Embed(source='GenericImageFileName.png')

person jugg1es    schedule 03.06.2013
comment
-1; Я не понимаю, как / почему это отличается от того, что было опубликовано в вопросе; кроме использования другого пути. - person JeffryHouser; 03.06.2013
comment
Мой вопрос не о добавлении изображения. Мой вопрос об использовании MultiDPIBitmapSource с IconItemRenderer для поддержки нескольких точек на дюйм. - person Alexander Farber; 04.06.2013
comment
Я работаю с flex почти 5 лет и столкнулся с множеством идиосинкразий, которые вызывают некорректное поведение без указания причины. Полагаю, мне следовало пояснить, что я говорю о синтаксисе, и игнорировать фактический путь. Я просто скопировал / вставил код, над которым работал. Если бы встраивание не работало, то изображение не отображалось бы и могло не вызывать ошибки. - person jugg1es; 04.06.2013
comment
У проблемы может быть только несколько причин, потому что код выглядит так, как будто он работает. Либо изображений нет, либо DPI не считывается правильно. Сначала я предполагаю, что изображения не встраиваются, поэтому я опубликовал свой ответ. - person jugg1es; 04.06.2013