自制 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); |
附件:源码下载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架