Компонент слайдера диапазона вспышки - PullRequest
1 голос
/ 05 января 2010

Есть ли что-то похожее на этот компонент jquery во флэш-памяти или есть готовые примеры, как это сделать?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 05 января 2010

Я не знаю каких-либо встроенных (или, в этом отношении, сторонних) компонентов такого рода. Однако я уверен, что некоторые сторонние должны существовать, но они вряд ли будут бесплатными.

Вы можете создать свой собственный без особых проблем. Я создал базовую рабочую версию, на которой вы можете построить, если хотите:

// Main class, shows how to use other classes:

import flash.display.*;
import flash.events.*;
import flash.text.TextField;


public class Main extends Sprite
{
    private var output:TextField;
    private var range:RangeSlider;

    public function Main()
    {
        output = new TextField();
        addChild(output);

        // SliderImage and ThumbImage are PNGs exported (inheriting from BitmapData) from the fla
        var thumb:SliderThumb = new SliderThumb(new ThumbImage(20, 20), stage);
        range = new RangeSlider(new SliderImage(1, 1), thumb, 100);

        range.x = 55;
        range.y = 55;

        range.addEventListener(Event.CHANGE, updateOutput);

        addChild(range);

        updateOutput();
    }

    private function updateOutput(e:Event = null):void
    {
        output.text = range.min + ' to ' + range.max;
    }
}

Класс SliderThumb:

import flash.display.*;
import flash.events.*;
import flash.geom.Point;

public class SliderThumb extends Sprite
{
    private var image:Bitmap;
    private var mouseIsDown:Boolean;
    private var _stage:Stage;

    public var min:Number;
    public var max:Number;


    public function SliderThumb(imageData:BitmapData, _stage:Stage)
    {
        min = max = 0;

        this._stage = _stage;

        image = new Bitmap(imageData);
        addChild(image);

        addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);

        mouseIsDown = false;

        // Center image:
        image.x = -Math.round(image.width / 2);
        image.y = -Math.round(image.height / 2);

        addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
        _stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
        _stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
    }

    public function clone():SliderThumb
    {
        var clone:SliderThumb = new SliderThumb(image.bitmapData, _stage);

        clone.min = min;
        clone.max = max;

        return clone;
    }

    private function mouseDown(e:MouseEvent):void
    {
        mouseIsDown = true;
    }

    private function mouseUp(e:MouseEvent):void
    {
        mouseIsDown = false;
    }

    private function mouseMove(e:MouseEvent):void
    {
        if (mouseIsDown) {
            x = parent.globalToLocal(new Point(_stage.mouseX, 0)).x;

            if (x < min) {
                x = min;
            }
            else if (x > max) {
                x = max;
            }

            dispatchEvent(new Event(Event.CHANGE));
        }
    }
}

Класс RangeSlider:

import flash.display.*;
import flash.events.*;
import flash.geom.Point;

public class RangeSlider extends Sprite
{
    private var background:BitmapData;
    private var sliders:Array;

    // Background is a one-pixel wide image that will be tiled horizonatally to give the slider its look
    public function RangeSlider(background:BitmapData, slider:SliderThumb, size:Number)
    {
        this.background = background;

        slider.min = 0;
        slider.max = size;
        sliders = [slider, slider.clone()];
        for each (slider in sliders) {
            addChild(slider);
            slider.addEventListener(Event.CHANGE, function (e:Event) { dispatchEvent(e); });        // Pass on the CHANGE event
        }
        sliders[1].x = size;

        this.size = size;
    }

    public function set size(value:Number):void
    {
        // Update background:
        graphics.clear();
        graphics.beginBitmapFill(background);           // Tiles by default
        graphics.drawRect(0, 0, value, background.height);
        graphics.endFill();
    }

    // Returns the position of the first slider (from 0 to size):
    public function get min():Number
    {
        return sliders[0].x;
    }

    // Returns the position of the second slider (from 0 to size):
    public function get max():Number
    {
        return sliders[1].x;
    }
}
1 голос
/ 25 августа 2011

Если вы открыты для импорта библиотек Flex, есть пара уже созданных решений:

  1. Библиотека Flex 3 MX содержит компонент-слайдер , который поддерживает два больших пальца.
  2. Патрик Маурер создал компонент-слайдер Flex 4 Spark, в котором также реализована опция для нескольких больших пальцев. Тем не менее, я думаю, что в настоящий момент у него все еще есть функция trackHighlight (как видно на примере jQuery UI) в его списке дел. Хотя в инфраструктуре скинов Flex 4 это не так сложно реализовать. Он доступен бесплатно на GitHub: https://github.com/pmowrer/spark-components

Как я уже сказал, оба эти решения требуют использования библиотек Flex, что означает дополнительные издержки. Тем не менее, они являются действительными «Flash» решениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...