Feathers:callout

来自Starling中文站
跳转到: 导航, 搜索

原文地址:http://wiki.starling-framework.org/feathers/callout

目录

如何使用 Feathers 呼出菜单组件

Callout 类在其他所有显示对象之上渲染一个弹出菜单。通常callout呼出菜单是一个矩形,外框有一个箭头标记或者尾巴标记指向对应的源显示对象,比如一个按钮。箭头可能出现在callout的任何一个边缘。点击callout区域以外的任何地方将会自动关闭callout.

基础

创建callout的方式与Feathers其他组件有一些区别。我们调用静态函数 Callout.show()来创建一个callout,这样比直接调用构造函数好得多. 让我们看看如何实现点击一个按钮显示带有Starling Image的呼出菜单。首先,创建按钮:

var button:Button = new Button();
button.label = "Click Me";
button.addEventListener( Event.TRIGGERED, button_triggeredHandler );
this.addChild( button );

然后在 Event.TRIGGERED 事件的监听器里创建呼出菜单:

function button_triggeredHandler( event:Event ):void
{
    var button:Button = Button( event.currentTarget );
    var content:Image = new Image( myTexture );
    var callout:Callout = Callout.show( content, button );
}

有两个参数是必须的。第一个参数是callout的显示内容,它可以是任意Starling显示对象,callout会自动调整大小来适应它的显示对象内容,除非你主动设置width或者height。第二个参数是callout的源对象,当callout显示时,它会自动调整位置使他的箭头标记指向源对象。

调用 close() 函数可以关闭呼出菜单。

让我们看看Callout.show()的其他参数。

方向

下一个参数是callout的方向,指定了callout相对于源对象的位置方向. 默认值是DIRECTION_ANY] ,这意味着callout可能在源对象的 above], below], left, right 任意一个方向. callout会根据一些因素自动的选择准确的方向,从而设置理想的显示位置.如果你只想callout只显示一个方向,你可以通过指定此参数一个特定的方向.

模态

接下来的是 isModal 参数,它决定了是否有叠加层在callout和其他显示对象之间. 当callout是模态的时候, 叠加阻断了所有在callout之下的显示对象的鼠标活动. 关闭callout可以调用 Callout 实例的close() 方法或者点击callout区域以外的地方.如果callout不是模态的, callout在点击非自身区域的地方仍然会关闭(和模态一样), 但是没有叠加层阻断鼠标活动, 任何callout以下的显示对象仍然可以进行交互.

Callouts 用PopUpManager 显示. 通常模态叠加层是被PopUpManager管理的, 但是你可以通过设置静态属性calloutOverlayFactory来指定一个自定义的叠加层来给callout:

Callout.calloutOverlayFactory = function():DisplayObject
{
    return new TiledImage( myTexture );
};

当调用PopUpManager.addPopUp() 来显示callout, 该自定义的叠加层工厂方法将以一个参数的形式传进来。

自定义呼出菜单工厂

Callout.show()创建一个callout, Callout.calloutFactory() 被调用来实例化一个 Callout 实例. Callout.show() 的最后一个参数允许你指定一个自定义的callout工厂方法,这可以让你自定义一个与众不同的callout.例如,比如说我们想创建一个callout有着特殊的皮肤,我们可以像这样创建callout工厂方法:

function customCalloutFactory():Callout
{
    var callout:Callout = new Callout();
    callout.nameList.add( "my-custom-callout" );
    return callout;
};
Callout.show( content, origin, Callout.DIRECTION_ANY, true, customCalloutFactory );

如果你已经有了一个 custom theme, 你可以设置一个名字为"my-custom-callout" 的initializer来提供不同的皮肤给callout.

给呼出菜单换个外观

Callouts 有很多皮肤和样式属性用来定制他们的外观. 让我们先来看皮肤.

callout.backgroundSkin = new Scale9Image( backgroundTextures );
callout.topArrowSkin = new Image( topArrowTexture );
callout.rightArrowSkin = new Image( rightArrowTexture );
callout.bottomArrowSkin = new Image( bottomArrowTexture );
callout.leftArrowSkin = new Image( leftArrowTexture );

背景和每个指向箭头都有单独的皮肤. 如果想在箭头皮肤遮盖背景边界的一部分时没有缝隙, 你应该设置每一个方向的箭头的gap为负数:

callout.topArrowGap = callout.rightArrowGap = callout.bottomArrowGap =
    callout.leftArrowGap = -2;

说到边框, 你可以用填充样式确保callout的边界在内容显示对象周围可见.

callout.topArrowGap = 6;
callout.rightArrowGap = 8;
callout.bottomArrowGap = 6;
callout.leftArrowGap = 8;

最后,有一些设置stage padding的静态属性,他们确定了callouts离舞台边缘有多少像素.

Callout.stagePaddingTop = Callout.stagePaddingRight = Callout.stagePaddingBottom =
    Callout.stagePaddingLeft = 10;

不用主题给呼出菜单换皮肤

如果你没有使用主题, 你可以设置 Callout.calloutFactory 方法来给callout换肤.

function skinnedCalloutFactory():Callout
{
    var callout:Callout = new Callout();
    callout.backgroundSkin = new Scale9Image( myTextures );
    callout.topArrowSkin = new Image( myTopTexture );
    // etc...
    return callout;
};
Callout.calloutFactory = skinnedCalloutFactory;

比起传皮肤给调用Callout.show()返回的Callout实例来给呼出菜单换肤,你更应该直接使用工厂方法给callout指定皮肤 . 如果你在Callout.show() 调用以后才换肤, callout的显示位置可能会出错.

相关链接

For more tutorials, return to the Feathers Documentation.


翻译者:王庆

个人工具
名字空间

变换
操作
导航
Starling中文资料
Starling原创教程
论坛
友链
工具箱