自制 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);

附件:源码下载

 

posted @ 2010-09-04 16:34  橡树小屋  阅读(2972)  评论(10编辑  收藏  举报
追逐梦想,永不停息