在 Flex 4 应用程序(带有 Spark 组件)中,我有一个ViewStack
带有各种屏幕的屏幕,以及一个TabBar
在它们之间导航的屏幕。我希望屏幕能够在它们发生某些事情时“闪烁”它们的选项卡(如 Windows 任务栏按钮)。
我怎样才能做到这一点?我的想法是通过在闪烁时将*放入屏幕label
(从 NavigatorContent 继承)来破解闪烁状态,并以某种方式在自定义标签栏皮肤中读取它。
有没有更简单的方法?如果现在,我该如何实现我的?
在 Flex 4 应用程序(带有 Spark 组件)中,我有一个ViewStack
带有各种屏幕的屏幕,以及一个TabBar
在它们之间导航的屏幕。我希望屏幕能够在它们发生某些事情时“闪烁”它们的选项卡(如 Windows 任务栏按钮)。
我怎样才能做到这一点?我的想法是通过在闪烁时将*放入屏幕label
(从 NavigatorContent 继承)来破解闪烁状态,并以某种方式在自定义标签栏皮肤中读取它。
有没有更简单的方法?如果现在,我该如何实现我的?
这有点难以解释,因为它不是最容易做的事情,但我会尽力而为。我将<s:TabBar />
使用视图堆栈中所有视图的数组的 dataProvider 创建一个,并为您的 TabBar 创建一个自定义项渲染器,然后包含一个自定义组件,该组件扩展 ButtonBarButton,该组件具有双向绑定的闪烁属性和自定义外观让它闪烁,像这样:(满嘴的人)
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:local="*">
<fx:Script>
<![CDATA[
import mx.collections.ArrayList;
]]>
</fx:Script>
<s:TabBar dataProvider="{new ArrayList([view1,view2])}">
<s:itemRenderer>
<fx:Component>
<local:BlinkingTab label="{data.label}" blink="@{data.isBlinking}" skinClass="BlinkingTabSkin" />
</fx:Component>
</s:itemRenderer>
</s:TabBar>
<mx:ViewStack>
<local:Foo id="view1" label="View 1" />
<local:Foo id="view2" label="View 2" />
</mx:ViewStack>
</s:Application>
在这种情况下,我的视图扩展了“NavigatorContent”,但是,我们需要能够表达一个布尔标志来表示选项卡需要闪烁,如下所示:
<s:NavigatorContent xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
implements="ITabView">
<fx:Script>
<![CDATA[
private var _blink:Boolean = false;
[Bindable]
public function get isBlinking():Boolean
{
return this._blink;
}
public function set isBlinking(value:Boolean):void
{
this._blink = value;
}
]]>
</fx:Script>
</s:NavigatorContent>
您会注意到该视图正在实现 ITabView。这仅用于对“isBlinking”属性进行类型检查,但它是可选的。当您希望标签闪烁时,只需将其设置为“true”。但现在我们需要让选项卡真正闪烁。在我们为 TabBar 创建的自定义组件“BlinkingTab”中,我们需要接收 blink 属性并适当地更改皮肤状态,如下所示:
<s:ButtonBarButton 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[
private var _blink:Boolean;
[Bindable]
public function get blink():Boolean
{
return this._blink;
}
public function set blink(value:Boolean):void
{
this._blink = value;
}
override protected function getCurrentSkinState():String
{
if(!selected && enabled && this._blink)
{
return super.getCurrentSkinState()+'Blinking';
}else{
return super.getCurrentSkinState();
}
}
override protected function mouseEventHandler(event:Event):void
{
super.mouseEventHandler(event);
if(event.type == MouseEvent.CLICK)
{
blink = false;
}
}
]]>
</fx:Script>
</s:ButtonBarButton>
您会注意到,如果皮肤状态已启用且未选中,则其上只会显示“闪烁”字符串。如果被选中,它不会闪烁;如果用户单击选项卡,它将删除应该传播回视图的闪烁标志(我不确定这部分,总是可以覆盖“选定”属性或其他东西)。最后一部分是皮肤;您需要创建一个自定义皮肤,以便您可以将闪烁动画添加到您的选项卡。只需使用使用 TabBarButtonSkin 的 ButtonBarButton 宿主组件创建一个新外观并添加这些新状态:
<s:State name="upBlinking" basedOn="up" stateGroups="blinking" />
<s:State name="overBlinking" basedOn="over" stateGroups="blinking" />
<s:State name="downBlinking" basedOn="down" stateGroups="blinking" />
从这里开始,您需要创建自己的基于状态的闪烁。这还没有经过全面测试,但我想我帮助你完成了 95% 的工作。希望这可以帮助。
顺便说一句,这种方法是 100% 合法的。没有黑客攻击,您可以在其他地方重用代码的每一部分:)