如何将Flex Mobile ActionBar稍微移动一下?

时间:2011-11-02 18:42:47

标签: actionscript-3 flex flash-builder4.5 flex-mobile

我试图简单地将actionBar向下移动75像素,这样我就可以在那里挤压adMob广告。

我试过了:

navigator.actionBar.y=75;

但是,我没有看到任何视觉上的不同,它没有移动,它没有给我任何错误,但如果我做trace(navigator.actionBar.y);它声称它是在75 ....即使它显然不在屏幕上

有没有人有任何想法?此外,这只适用于一个视图,我无法使用可在整个应用程序中移动操作栏的解决方案。我只是需要在这个特殊的观点中向下移动。

谢谢!

编辑: @布赖恩, 谢谢你的建议,几乎完成了这一切。我正在尝试在皮肤内部创建一个功能,为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();

up top ...然后我只是尝试做一个简单的事情:

ad.adMobVisible(true);

但没有任何反应。有任何想法吗?感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

如果您检查ViewNavigatorSkin的代码,您会发现它使用简单的数学方法列出了它的两个项目(ActionBarGroup)。换句话说,它没有使用布局容器,其中设置topy会产生任何影响。

相反,您需要为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。您可以考虑使用基于ViewNavigatorSkin源代码的纯ActionScript创建皮肤,以便您可以将其与偏移量放在一起......但如果您没有注意到MXML皮肤的巨大性能损失,我就不会'担心它。

修改 在我写完答案之后我注意到你只想要一个视图。我做了一个修改,将状态添加到VNSkin类,然后在视图代码(viewActivateviewDeactivate中切换状态。对于记录,这一切都感觉像是一个黑客。我会考虑某种通知机制,以便你可以与皮肤进行通信,以便以不同于此的方式进行更改...但我至少让你通过一种技术来实现这一目标。我会我喜欢看到有人来这里并提出更好的建议。在那之前,你有一些有用的东西:P