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

mySlider是slider的主类,通过setMc(mc:ISlider);控制传入的操作接口,控制影片剪辑。rotateMc,Resize是操作方法,继承接口ISlider,以后要扩展各种功能,只要新建方法类继承ISlider就可以了。
其中用类updateAfterEvent()强制刷新屏幕,虽然会对效率产生一些影响,但是对于提高用户体验是有必要的。下面示例是没有加updateAfterEvent的效果。主要差别在滑块拖动时候的反应上。
【示例演示】
【代码说明】
这里并没有完全按照官方slider组件的模式来开发,没有发送消息事件,而是通过setMc(mc:ISlider)来装载影片剪辑,内部发送数据到继承了ISlider接口的对象,这样的好处是按需订制功能。
【ISlider】
共同方法:updateData,获取slider对象的滑块数据
package com.babyzone.slider {
public interface ISlider {
function updateData(num:Number):void;
}
}
【mySlider】
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】
实现旋转+缓动功能的类。
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】
实现扩大缩小的类
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;
}
}
}
【调用方法】
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);
附件:源码下载
浙公网安备 33010602011771号