4

このページが示すものと非常によく似た、ActionScript に丸いスライダーを入れたいと思っています。

ここに画像の説明を入力

最終的にはオブジェクトの色相を変更する (CMY 値を返す) ことになりますが、程度を吐き出すだけであれば、それで完全に作業できます。この機能を備えたリソース、チュートリアル、疑似コード、またはスニペットを知っている場合は、大いに感謝します。ありがとう!

4

1 に答える 1

3

以下は、この問題に対する私の解決策です。

Flash の角度は度ではなくラジアンで処理されることに注意してください。これが、コード内の変換メソッドに気付く理由です。個人的には、角度を度で設定する方が視覚化して理解しやすいと思います。これが、CircleSliderコンストラクターが度の値を受け入れ、CircleSliderEventクラスが度とラジアンの両方を送出する理由です。

使用事例:

var circleSlider:CircleSlider = new CircleSlider(100, 270);
circleSlider.x = stage.stageWidth / 2;
circleSlider.y = stage.stageHeight / 2;
circleSlider.addEventListener(CircleSliderEvent.CHANGE, circleSliderEventHandler);

addChild(circleSlider);

function circleSliderEventHandler(event:CircleSliderEvent):void
{
    trace(event.degrees, event.radians);
}

CircleSlider クラス:

package
{
    //Imports
    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.events.Event;
    import flash.events.MouseEvent;

    //Class
    public class CircleSlider extends Sprite
    {
        //Properties
        private var mRadius:uint;
        private var mAngle:Number;
        private var mThumb:Sprite;

        //Constructor
        public function CircleSlider(radius:uint, degrees:Number)
        {
            mRadius = radius;
            mAngle = degrees;

            init();
        }

        //Init
        private function init():void
        {
            createCircle();
            createThumb();
            positionThumb(degreesToRadians(mAngle));
        }

        //Create Circle
        private function createCircle():void
        {
            var circle:Shape = new Shape();
            circle.graphics.lineStyle(4.0, 0xFFDDDD, 1.0);
            circle.graphics.drawCircle(0, 0, mRadius);

            addChild(circle);
        }

        //Create Thumb
        private function createThumb():void
        {
            mThumb = new Sprite();
            mThumb.graphics.beginFill(0xFF2222, 1.0);
            mThumb.graphics.drawCircle(0, 0, 10);
            mThumb.graphics.endFill();

            mThumb.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventHandler);

            addChild(mThumb);
        }

        //Mouse Down Event Handler
        private function mouseDownEventHandler(event:MouseEvent):void
        {
            mThumb.addEventListener(Event.ENTER_FRAME, enterFrameEventHandler);

            stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);
            stage.addEventListener(Event.MOUSE_LEAVE, mouseUpEventHandler);
        }

        //Enter Frame Event Handler
        private function enterFrameEventHandler(event:Event):void
        {
            positionThumb(Math.atan2(mouseY, mouseX));
        }

        //Mouse Up Event Handler
        private function mouseUpEventHandler(event:MouseEvent):void
        {
            mThumb.removeEventListener(Event.ENTER_FRAME, enterFrameEventHandler);

            stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);
            stage.removeEventListener(Event.MOUSE_LEAVE, mouseUpEventHandler);
        }

        //Position Thumb
        private function positionThumb(radians:Number):void
        {
            mThumb.x = Math.cos(radians) * mRadius;
            mThumb.y = Math.sin(radians) * mRadius;

            mAngle = radiansToDegrees(radians);

            dispatchEvent(new CircleSliderEvent(CircleSliderEvent.CHANGE, mAngle, radians));
        }

        //Degrees To Radians
        private function degreesToRadians(degrees:Number):Number
        {
            return degrees * Math.PI / 180;
        }

        //Radians To Degrees
        private function radiansToDegrees(radians:Number):Number
        {
            return radians * 180 / Math.PI;
        }

        //Set Angle
        public function set angle(degrees:Number):void
        {
            positionThumb(degreesToRadians(degrees));
        }

        //Get Angle
        public function get angle():Number
        {
            return mAngle;
        }
    }
}

CircleSliderEvent クラス:

package
{
    //Imports
    import flash.events.Event;

    //Class
    public class CircleSliderEvent extends Event
    {
        //Constants
        public static const CHANGE:String = "change";

        //Properties
        public var degrees:Number;
        public var radians:Number;

        //Constructor
        public function CircleSliderEvent (type:String, degrees:Number = NaN, radians:Number = NaN) 
        {
            super(type);

            this.degrees = degrees;
            this.radians = radians;
        }

        //Clone
        public override function clone():Event
        {
            return new CircleSliderEvent (type, degrees, radians);
        }

        //To String
        public override function toString():String
        {
            return formatToString("CircleSliderEvent", "type", "degrees", "radians");
        }
    }
}
于 2012-11-04T21:19:17.570 に答える