Flex 4滑块有两个拇指

时间:2010-04-20 18:57:58

标签: flex actionscript-3 flex4

有人知道如何使用两个拇指在Flex 4(spark)中制作自定义hslider吗?由于Flex 4滑块组件的thumbcount属性不再可用(在mx组件上很容易设置)。我必须设计轨道和拇指的样式。

教程会很好。

THX, TUX。

5 个答案:

答案 0 :(得分:3)

我没有完整的教程,但这是创建自定义hslider组件的前几个步骤。希望它有所帮助。

首先看看由2个部分组成的滑板皮,拇指和轨道:

<s:Button id="track" left="0" right="0" top="0" bottom="0" minWidth="33" width="100"
              skinClass="spark.skins.spark.HSliderTrackSkin" />
<s:Button id="thumb" top="0" bottom="0" width="11" height="11" 
              skinClass="spark.skins.spark.HSliderThumbSkin" />

现在,创建一个新皮肤,除了给它两个按钮:

<s:Button id="track" left="0" right="0" top="0" bottom="0" minWidth="33" width="100"
                  skinClass="spark.skins.spark.HSliderTrackSkin" />
<s:Button id="thumb" top="0" bottom="0" width="11" height="11" 
                  skinClass="spark.skins.spark.HSliderThumbSkin" />
<s:Button id="thumb2" top="0" bottom="0" width="11" height="11" 
                  skinClass="spark.skins.spark.HSliderThumbSkin" />

创建一个扩展HSlider的新组件,并将其称为MultiButtonSlider。覆盖partAdded()函数并在添加时获取对thumb2的引用。

override protected function partAdded(partName:String, instance:Object):void{
if(partName == "thumb2"){
    thumb2 = instance as Button;
}
}

希望这能让你朝着正确的方向前进。别忘了设置MultiButtonSlider.skinClass =“YourNewSkin”

接下来的步骤是使其可拖动并将其点转换为值。请参阅HSlider.pointToValue()函数。

答案 1 :(得分:2)

Patrick Mowrer在GitHub上有一个免费的:https://github.com/pmowrer/spark-components

我能够在最近的项目中使用它而没有太多问题。该组件不公开(向MXML)Spark所做的所有属性(例如,dataTipFormatFunction不存在),但仍然可以通过自定义皮肤访问和自定义它们。

答案 2 :(得分:1)

我遇到了同样的问题。我现在正在使用mx组件而不是sparks compontent。

<mx:HSlider x="46" y="358" minimum="1" maximum="600" snapInterval="1"
thumbCount="2" values="[1,600]" id="hsTiming" height="23" width="618" 
change="hsTiming_changeHandler(event)"/>

答案 3 :(得分:1)

您可以查看此主题(AS3)

Flash Range Slider Component

答案 4 :(得分:1)

为了补充shi11i的答案,谁让我走上正轨,这里是完整的代码:

package test.components

{

import flash.geom.Point;

import spark.components.Button;
import spark.components.Group;
import spark.components.HSlider;


public class HSliderTwoThumbs extends HSlider
{
    private var _value2:Number;

    [Bindable]
    public function get value2():Number
    {
        return _value2;
    }

    public function set value2(value:Number):void
    {
        _value2=value;
        invalidateDisplayList();
    }


    [SkinPart(required="true")]
    public var thumb2:Button;

    public function HSliderTwoThumbs()
    {
        super();
        //this.setStyle("skinClass", "HRangeSliderSkin");
    }

    override protected function partAdded(partName:String, instance:Object):void
    {
        super.partAdded(partName, instance);
    }


    override protected function updateSkinDisplayList():void
    {
        super.updateSkinDisplayList();

        if (!thumb2 || !track || !rangeDisplay)
            return;

        var thumbRange:Number=track.getLayoutBoundsWidth() - thumb2.getLayoutBoundsWidth();
        var range:Number=maximum - minimum;

        // calculate new thumb position.
        var thumbPosTrackX:Number=(range > 0) ? ((value2 - minimum) / range) * thumbRange : 0;
        // convert to parent's coordinates.
        var thumbPos:Point=track.localToGlobal(new Point(thumbPosTrackX, 0));
        var thumbPosParentX:Number=thumb2.parent.globalToLocal(thumbPos).x; //- distanceToSecondThumb

        thumb2.setLayoutBoundsPosition(Math.round(thumbPosParentX), thumb2.getLayoutBoundsY());

    }

}}

以下是如何使用它:

    <components:HSliderTwoThumbs id="sliderTwoThumbs"                                                skinClass="test.skins.HRangeSliderSkin"
width="300"
minimum="0"
maximum="300"
value="150"
value2="100"

/>

希望这会有所帮助。

注意:在我的情况下,我没有处理第二个游标的可拖动性,因为我不需要它(它是一个“只读”组件)。不过,我会对你如何处理它感兴趣。