【发布时间】:2010-10-26 07:52:55
【问题描述】:
我有一个简单的滑块,只有 3 个选项。强迫用户拖动滑块上的小缩略图似乎很奇怪,而单击滑块旁边的 3 个实际标签之一会容易得多。有谁知道如何做到这一点?
【问题讨论】:
标签: user-interface button label slider flex3
我有一个简单的滑块,只有 3 个选项。强迫用户拖动滑块上的小缩略图似乎很奇怪,而单击滑块旁边的 3 个实际标签之一会容易得多。有谁知道如何做到这一点?
【问题讨论】:
标签: user-interface button label slider flex3
这是一个很酷的问题。
Slider 使用的 Label 对象原来是 Label 的子类(称为 SliderLabel)。因此,最好的方法可能是继承 Slider 并将事件侦听器添加到标签。
我认为您可以在 commitProperties 方法或 updateDisplayList 方法中成功添加事件侦听器。我不确定一个是否比另一个更可取,但 commitProperties 似乎是 more 正确的选择。
所以,在您的 Slider 子类中:
override protected function commitProperties():void
{
super.commitProperties();
for(var i:int = 0; i < labelObjects.numChildren; i++)
{
if(!SliderLabel(labelObjects.getChildAt(i)).hasEventListener(MouseEvent.CLICK))
{
SliderLabel(labelObjects.getChildAt(i)).addEventListener(MouseEvent.CLICK,sliderLabelClickListener);
}
}
}
然后对于sliderLabelClickListener 可能是这样的:
private function sliderLabelClickListener(e:MouseEvent):void
{
dispatchEvent( new SliderLabelClickEvent(e.target) );
}
我想你会想要一个自定义事件,而不是发送一个常规的Event,所以你可以包含标签的名称/ID/值。
此外,当从舞台上移除 Slider 时,您可能需要添加一个“dispose”方法来从标签中移除 CLICK 事件侦听器。如果您不打算删除 Slider,这不是问题,但如果您是,我通常做的是创建一个名为 dispose 的方法并将我所有的手动删除逻辑放在那里(删除事件侦听器、取消监视/删除 ChangeWatchers )。然后我为组件的REMOVED_FROM_STAGE 事件分配一个侦听器,并从该侦听器调用dispose 方法。
【讨论】:
您确定滑块是在这种情况下使用的最佳组件吗?一般来说,当用户有大量连续选项可供选择时,将使用滑块,其中用户选择的精度并不重要(例如,音量滑块 - 音量为 51% 而不是 50%真的不会有太大的不同)。
如果您只有三个选项,并且只允许用户选择这三个选项之一,我建议使用组合框或单选按钮组。
【讨论】: