自制 flash slider滚动条

这段时间用flash做了一个项目,其中用到了flash slider滚动条的功能,本来想用官方的组件,无奈修改样式过于麻烦,也不好用,所以自己制作了一个,可以实现相类似的功能。

【实例演示】

代码结构如下:

mySlider是slider的主类,通过setMc(mc:ISlider);控制传入的操作接口,控制影片剪辑。rotateMc,Resize是操作方法,继承接口ISlider,以后要扩展各种功能,只要新建方法类继承ISlider就可以了。

其中用类updateAfterEvent()强制刷新屏幕,虽然会对效率产生一些影响,但是对于提高用户体验是有必要的。下面示例是没有加updateAfterEvent的效果。主要差别在滑块拖动时候的反应上。

【示例演示】

【代码说明】

这里并没有完全按照官方slider组件的模式来开发,没有发送消息事件,而是通过setMc(mc:ISlider)来装载影片剪辑,内部发送数据到继承了ISlider接口的对象,这样的好处是按需订制功能。

【ISlider】

1
共同方法:updateData,获取slider对象的滑块数据
1
2
3
4
5
6
7
package com.babyzone.slider  {
     
    public interface ISlider {
        function updateData(num:Number):void;
    }
     
}

【mySlider】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.babyzone.slider  {
    import flash.display.MovieClip;
    import flash.geom.Rectangle;
    import flash.events.*;
    /*
    num:滚动条的最大刻度值,
    setMiddle方法,设置滑块为中间的情况
    reset 重置
    setMc 控制传入的Islider
    */
    public class mySlider extends MovieClip {
 
        //滑块可拖动区域
        private var drag_area:Rectangle;
        //滑块移动的刻度
        private var numBer:Number;
        //滑块的最大刻度
        private var maxNum:Number;
        //要处理的对象
        private var iObj:ISlider;
        //设置滑块参照的坐标
        private var relateX:Number;
        private var relateWidth:Number;
         
        public function mySlider(num:Number) {
            maxNum = num;
            drag_area = new Rectangle(this.scrollable_area.x,this.scrollable_area.y, this.scrollable_area.width - this.scroller.width,0);
            this.scroller.addEventListener( MouseEvent.MOUSE_DOWN, scroller_drag );
            relateX = drag_area.x;
            relateWidth = drag_area.width;
        }
    /*----------------------------滑块拖动效果--------------------------------*/
    private function scroller_drag( e:MouseEvent ):void {
            this.scroller.startDrag(false, drag_area);
            stage.addEventListener(MouseEvent.MOUSE_UP, up);
            //当移动滑块,强制重绘屏幕
            stage.addEventListener(MouseEvent.MOUSE_MOVE,updateScreen);
        }
    private function up( e:MouseEvent ):void {
            this.scroller.stopDrag();
            stage.removeEventListener(MouseEvent.MOUSE_UP, up);
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, updateScreen);
        }
    private function updateScreen(e:MouseEvent) {
            //当前刻度
            numBer = maxNum * (this.scroller.x - relateX) / drag_area.width;
            numBer = numBer < -0.8? -0.8:numBer;
            if (iObj) {
                deliveData(numBer);
            }
             
        }
    public function reset():void {
            this.scroller.x = this.scrollable_area.x;
            numBer = maxNum * (this.scroller.x - drag_area.x) /relateWidth ;
            deliveData(numBer);
        }
    public function setMiddle():void {
            this.scroller.x =drag_area.x+(this.scrollable_area.width - this.scroller.width) / 2;
            relateX =this.scroller.x;
            relateWidth = drag_area.width/2;
        }
    /*----------------------------滑块拖动效果 end----------------------------*/
     
    /*----------------------------对传入的MC,设置----------------------------*/
    public function setMc(mc:ISlider):void {
            iObj = mc;
        }
    private function deliveData(num:Number):void {
            iObj.updateData(num);
        }
    }
}

【rotateMc】

实现旋转+缓动功能的类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.babyzone.slider  {
     
    /*
    mc:     重设角度的元件剪辑
    angle:  角度,1代表一圈
    speed   缓动的速度 0-1
    */
     
    import flash.display.MovieClip;
    import flash.events.Event;
    public class rotateMc extends MovieClip implements ISlider {
         
        private var this_mc:MovieClip;
        private var realNum:Number=0;
        private var mcSpeed:Number;
         
        public function rotateMc(mc:MovieClip,speed:Number) {
            this_mc = mc;
            mcSpeed = speed;
            this.addEventListener(Event.ENTER_FRAME, setRotate);
        }
        public function updateData(num:Number):void{
            realNum = num * 360;
        }
        public function setRotate(e:Event):void {
            var thisRotation = this_mc.rotation >= 0? this_mc.rotation:this_mc.rotation + 360;
            this_mc.rotation += (realNum - thisRotation) * mcSpeed;
        }
    }
     
}

【Resize】

实现扩大缩小的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.babyzone.slider  {
    import flash.display.MovieClip;
    import flash.events.Event;
    /*
    mc:     重设大小的元件剪辑
    speed:  缓动状态:0-1,1是正常状态
    */
    public class Resize extends MovieClip implements ISlider {
         
        private var old_width:Number;//原始影片剪辑的属性
        private var old_height:Number;
        private var mcSpeed:Number;
        private var this_mc:MovieClip;
        private var scale:Number=1;
         
        public function Resize(mc:MovieClip,speed:Number) {
            old_width=mc.width;
            old_height=mc.height;
            this_mc = mc;
            mcSpeed = speed;
            this.addEventListener(Event.ENTER_FRAME, set_size);
        }
         
        public function updateData(num:Number):void{
            num++;
            scale = num;
        }
         
        private function set_size(e:Event):void {
            this_mc.scaleX+=(scale-this_mc.scaleX)*mcSpeed;
            this_mc.scaleY+=(scale-this_mc.scaleY)*mcSpeed;
        }
    }
}

【调用方法】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import com.babyzone.slider.*;
//参数2是指3倍
var mc1:mySlider = new mySlider(1);
mc1.x = 100;
mc1.y = 20;
stage.addChild(mc1);
//测试扩大缩小
var obj:sampleObj=new sampleObj();
obj.x = 200;
obj.y = 160;
stage.addChild(obj);
 
var resizeObj:Resize = new Resize(obj,0.3);
mc1.setMc(resizeObj);
//测试旋转
var mc2:mySlider = new mySlider(1);
mc2.x = 100;
mc2.y = 40;
stage.addChild(mc2);
 
var resizeObj1:rotateMc = new rotateMc(obj,0.3);
mc2.setMc(resizeObj1);

附件:源码下载

 

posted @   橡树小屋  阅读(2977)  评论(10编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
追逐梦想,永不停息
点击右上角即可分享
微信分享提示