Flex 4带有两个滑块的滑动条

9

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

教程将是不错的选择。

谢谢, tux。

5个回答

3

我没有完整的教程,但以下是创建自定义hslider组件的前几个步骤。希望能帮到您。

首先看一下hslider皮肤,它由两个部分组成:滑块(thumb)和轨道(track):

<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" />

今日免费次数已满, 请开通会员/明日再来
override protected function partAdded(partName:String, instance:Object):void{
if(partName == "thumb2"){
    thumb2 = instance as Button;
}
}

希望这能为您指明正确的方向。别忘了设置MultiButtonSlider.skinClass = "YourNewSkin"。
下一步是使它可拖动并将其点转换为值。请参阅HSlider.pointToValue()函数。

2
Patrick Mowrer在GitHub上提供了免费的组件:https://github.com/pmowrer/spark-components
我最近在一个项目中使用这个组件并没有遇到太多问题。虽然该组件没有向MXML公开所有的属性(例如dataTipFormatFunction缺失),但是通过自定义皮肤仍可以访问和定制它们。

1

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

<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)"/>

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"

/>

希望这可以帮到你。
注意:在我的情况下,我没有处理第二个光标的可拖动性,因为我不需要它(它是一个“只读”组件)。但我很想看看你是如何处理它的。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接