自制 flash slider滚动条

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

【实例演示】

代码结构如下:

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

附件:源码下载

 

你可能感兴趣的:(slider)