Как немного сдвинуть Flex Mobile ActionBar вниз? - PullRequest
1 голос
/ 02 ноября 2011

Я пытаюсь просто переместить actionBar вниз на 75 пикселей, чтобы я мог втиснуть туда рекламу adMob.

Я пытался:

navigator.actionBar.y=75;

Но, я не вижу ничего другого визуально, он не движется, он не дает мне ошибок, но если я делаю trace(navigator.actionBar.y);, он заявляет, что он на уровне 75 ... даже если его явно нет на экране.

У кого-нибудь есть идеи? Кроме того, это будет только для ОДНОГО представления, я не могу использовать решение, которое бы перемещало панель действий вниз по всему приложению. Мне просто нужно, чтобы это переместилось вниз в ЭТОМ конкретном виде.

Спасибо!

EDIT: @Брайан, Спасибо за предложение, почти закончил весь этот бардак. Я пытаюсь сделать функцию внутри скина, чтобы добавить место для рекламы adMob. Но я не думаю, что я правильно ссылаюсь на функцию, потому что когда я делаю это, я не получаю никаких ошибок, и ничего не происходит.

<?xml version="1.0" encoding="utf-8"?>
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" >
    <!-- host component -->
    <fx:Metadata>
        [HostComponent("spark.components.ViewNavigator")]
    </fx:Metadata>
    <fx:Script>
        <![CDATA[

            public function adMobVisible(trueOrFalse:Boolean):void
            {
                if(trueOrFalse)
            {
                main_group.top=70;
            }
            else
            {
                main_group.top=0;
            }
            }

        ]]>
    </fx:Script>

    <!-- states -->
    <s:states>
        <s:State name="landscapeAndOverlay" />
        <s:State name="portraitAndOverlay" />
        <s:State name="landscape" />
        <s:State name="portrait" />
        <s:State name="disabled" />
        <s:State name="normal" />
        <!-- <s:State name="admob" /> -->
    </s:states>

    <s:VGroup id="main_group" width="100%" height="100%">
        <s:ActionBar id="actionBar" width="100%" />
        <s:Group id="contentGroup" width="100%" height="100%" />
    </s:VGroup>
</s:Skin>

Я сделал:

import skins.AdMobHolderSkin;

protected var ad:AdMobHolderSkin = new AdMobHolderSkin();

наверх ... тогда я просто попытался сделать простую вещь, такую ​​как:

ad.adMobVisible(true);

Но ничего не происходит. Есть идеи? Спасибо за помощь с этим.

1 Ответ

2 голосов
/ 03 ноября 2011

Если вы проверите код для ViewNavigatorSkin, вы обнаружите, что он раскладывает два своих элемента (ActionBar и Group), используя простую математику.Другими словами, он не использует контейнер макета, в котором настройка top или y будет иметь какой-либо эффект.

Вместо этого вам необходимо обработать ViewNavigator.Сначала определите скин (обратите внимание, как я установил top="75" в VGroup:

VNSkin.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark">
    <!-- host component -->
    <fx:Metadata>
        [HostComponent("spark.components.ViewNavigator")]
    </fx:Metadata>

    <!-- states -->
    <s:states>
        <s:State name="landscapeAndOverlay" />
        <s:State name="portraitAndOverlay" />
        <s:State name="landscape" />
        <s:State name="portrait" />
        <s:State name="disabled" />
        <s:State name="normal" />
        <s:State name="moved" />
    </s:states>

    <s:VGroup width="100%" height="100%" top="0" top.moved="75">
        <s:ActionBar id="actionBar" width="100%" />
        <s:Group id="contentGroup" width="100%" height="100%" />
    </s:VGroup>
</s:Skin>

Затем внутри моего основногоприложения, я сделаю скин ViewNavigator для использования этого скина:

MyApp.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                            xmlns:s="library://ns.adobe.com/flex/spark" firstView="views.ActionbarMoveHomeView" applicationDPI="160" >  
    <fx:Style>
        @namespace s "library://ns.adobe.com/flex/spark";
        s|ViewNavigator {
            skinClass: ClassReference("VNSkin")
        }   
    </fx:Style>
</s:ViewNavigatorApplication>

Наконец, на мой взгляд, мне нужно установить состояние и поставитьвозвращается, когда представление активируется и деактивируется:

MyView.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <s:viewActivate>
        navigator.skin.currentState = "moved";
    </s:viewActivate>

    <s:viewDeactivate>
        navigator.skin.currentState = "normal";
    </s:viewDeactivate>

    <s:Label text="test" click="navigator.pushView(SecondPage)" />
</s:View>

Обратите внимание, что этот метод добавляет некоторые накладные расходы, потому что ваша оболочка ViewNavigator теперь MXMLвместо чистого ActionScript. Вы можете подумать о создании обложки в чистом ActionScript на основе исходного кода ViewNavigatorSkin, чтобы вы могли разместить ее со смещением ... но если вы не заметили значительного снижения производительности из обложки MXML,Я бы не волновался об этом.

РЕДАКТИРОВАТЬ После того, как я написал свой ответ, я заметил, что вы хотите его только для одного просмотра. Я внес изменение, чтобы добавить состояние в VNSkin класс, а затем переключите состояния в коде представления (viewActivate и viewDeactivate. Дляecord, все это похоже на взломать.Я бы рассмотрел какой-то механизм уведомлений, чтобы вы могли общаться со скином, чтобы изменить его каким-либо иным способом ... но я, по крайней мере, помог вам сделать это с помощью одной техники.Я хотел бы, чтобы кто-то пришел сюда и предложил что-то лучшее.До этого у вас есть кое-что, что работает: P

...