引言

上一遍教程使用actionscript3.0构建一个异步加载图片的画廊(一) 主要讲述了其准备工作,接下来的这篇教程将讲解如何让滑动块随鼠标移动,从而构建个滚动条,通过这篇教程,你可以学习到actionscript3以下的知识点:
- actionscript3事件机制的应用
- 如果派发自定义事件
- 如何监测鼠标坐标,并应用于实战
这篇教程的关键在于对actionscript3事件的应用。
示例和下载包请到上一篇教程下载。
使用actionscript3.0构建滚动条
1、打开handle元件的文档类
有二种方法:
一、直接打开lib.Handle
二、点击“库“下的handle元件,右击,再点击”编辑类“。

- package lib {
- /**
- *Handle
- *@describe 滑动块滑动
- *@autor Ben Merckx
- *@note 明河共影注释
- *@site http://www.36ria.com/
- *@date 2010-06-02
- **/
- public class Handle extends MovieClip {
- //构造函数
- public function Handle() : void{
- }
- }
- }
起始代码如上,为了便于理解,明河这里都加上中文注释,可自行去掉。
2、实现滚动条的原理解析
这个原理不难,为了实现滑动效果,需要监听三个事件:鼠标按下、鼠标移动、鼠标放起,在鼠标按下时(获取x轴坐标)监听鼠标移动事件,获取新的x轴坐标,这时候要做个判断,即滑动块移动范围,不能低于滑动条的起始X轴位置,不能高于滑动条终点位置。
接下来来看详细代码。
3、构造函数解析
- //构造函数
- public function Handle() : void{
- //鼠标手型
- buttonMode = true;
- //监听鼠标按下
- addEventListener(MouseEvent.MOUSE_DOWN,moveHandle);
- //监听鼠标放起(留意这里是监听舞台的事件)
- stage.addEventListener(MouseEvent.MOUSE_UP,stopHandle);
- }
buttonMode = true;设置鼠标到滑动块的手型
addEventListener(MouseEvent.MOUSE_DOWN,moveHandle);监听元件鼠标按下事件
stage.addEventListener(MouseEvent.MOUSE_UP,stopHandle);这里有需要留意的地方不是监听元件的鼠标放起事件,而是监听舞台的,主要是因为很有可能鼠标在移动过程中没有在滑动块上,这时候依旧要触发鼠标放起事件,不然滑动块会一直移动下去。
4、鼠标按下事件
- /*
- *鼠标按下
- */
- private function moveHandle(_e:MouseEvent):void{
- //给鼠标位置赋值
- mousePos = mouseX;
- stage.addEventListener(MouseEvent.MOUSE_MOVE,followHandle);
- }
请在构造函数上定义
- //鼠标的位置(X轴)
- private var mousePos : Number = 0;
stage.addEventListener(MouseEvent.MOUSE_MOVE,followHandle);给舞台监听鼠标移动事件(当鼠标放起时,要删除这个监听事件)
5、来看followHandle
- /*
- *鼠标移动
- */
- private function followHandle(_e:MouseEvent):void{
- //新的位置
- var newPos:Number = stage.mouseX - mousePos;
- //滑动块影片剪辑旧的的x轴位置
- var orgX:Number = x;
- //确定滑动块的移动的位置,这里需要做二个判断,滑动块不能小于滑动条的x轴位置,也不能超过滑动条的宽度
- if(newPos < slider.x){
- goToX = slider.x;
- }
- else if(newPos > (slider.x + slider.width) - width){
- goToX = (slider.x + slider.width) - width;
- }else{
- goToX = newPos;
- }
- //改变滑动块位置
- x = goToX;
- //只有在滑动块有位移的时候才派发事件
- if( goToX != orgX ) dispatchEvent( new Event( "sliding", true ) );
- }
这是整个类的最关键部分,也是实现效果的最关键代码,明河予以详解。
- //新的位置
- var newPos:Number = stage.mouseX - mousePos;
获取新的x轴位置,此x轴位置应该是舞台中的鼠标x轴位置—旧的x轴位置。
- //确定滑动块的移动的位置,这里需要做二个判断,滑动块不能小于滑动条的x轴位置,也不能超过滑动条的宽度
- if(newPos < slider.x){
- goToX = slider.x;
- }
- else if(newPos > (slider.x + slider.width) - width){
- goToX = (slider.x + slider.width) - width;
- }else{
- goToX = newPos;
- }
这段代码最为关键。
当newPos < slider.x即新的x轴位置小于slider(即滑动条)的x轴位置,那么,goToX = slider.x;即要移动到的x轴位置为滑动条的x轴位置。
当newPos > (slider.x + slider.width) – width,即超过滑动条终点位置,那么移动到的x轴位置为滑动条的终点位置。
这里说明下为什么终点是(slider.x + slider.width) – width。

终点是如上图的黄色区域,所以slider.x + slider.width后必须减去滑动块的宽度
- //只有在滑动块有位移的时候才派发事件
- if( goToX != orgX ) dispatchEvent( new Event( "sliding", true ) );
这是非常关键的代码,当滑动块移动时将会派发出新的sliding事件,供外部监听。
6、鼠标放起
- /*
- *鼠标放起
- */
- private function stopHandle(_e:MouseEvent):void{
- //删除鼠标移动事件的监听
- stage.removeEventListener(MouseEvent.MOUSE_MOVE,followHandle);
- }
删除删除鼠标移动事件的监听。
至此Handle.as的代码结束,预览即可看到滑动块滑动效果。
下一篇教程将讲解如何使用actionscript3.0读取和处理xml。

很好
谢谢。
你好,我是初学者,private var slider : MovieClip = MovieClip(parent).slider;我想知道这句是什么意思。。。。slider在哪定义的。。。我在运行到slider.x的时候出错,说是空对象引用。。。是不是滑动条那里要绑定什么类文件。。
时间太久,我也忘记了。最好贴整段,我好回忆。
额。其实如果你的源文件给我看下,我应该会懂,可是下载完你的源文件哦,打开fla文件,说是未知格式,然后打开不了。。可能整个过程下来,你有些东西省略了,而我也没跟着创建,然后我在运行影片的时候,总是出现这样的错误
TypeError: Error #1009: 无法访问空对象引用的属性或方法。
at lib::Handle()
at lib::Gallery()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
在你的Gallery.as中,我咋找不到theHandle的定义。。。。。结果运行时,出现
1120: 访问的属性 theHandle 未定义。另外在goto函数中,图片计数那里,tt.text指的时候什么?是指一个元件实例,用来显示“第1/10张”这样的信息的吗?哎呀,我是完全0基础的。。弄的我好晕。。。
……..如果是0基础的话,看这个的确很吃力。之所以打不开fla文件,你用的flash是第几版本的?我用的是cs5,低于此版本,就有可能出现不兼容,打不开的问题会出现,tt.text你想的没错,就是图片数信息显示。
谢谢你啊~我用的是CS4难怪打不开了。。。呵呵。
能留下你的QQ吗。。。。我想直接问你。。。我已经按照你的步骤来做这个画廊了。。可是总是说访问了未声明的属性,在theHandle、slider那里总是出错。。。不好意思,打扰到你了
你好ilexcai ,你可以加793588730。呵呵没什么打扰不打扰的,能帮到你是我的荣幸。
你可以下载英文原文的demo代码,英文原文的demo是用flash cs4编码而成。