as3检测鼠标手势

原作者: Emanuele Feronato

在计算领域,一个指针设备的手势或者是一个鼠标的手势结合了指针设备的运动和点击,这种手势可以被一些软件识别到并作为一个具体的命令。指针设备的手势可以快速访问一个程序的命令功能。它们也可以方便一些敲打键盘有困难的人士。

例如,在一个浏览器中,用户如果想回到前一个浏览页面,他可以按住鼠标右键并向左拖一小段距离,然后松开右键。我总是先描述我的想法和代码,再展示运行结果。而今天,我会先从结果开始:

左上象限:在这个象限你可以通过鼠标进行简单绘画:按住鼠标然后拖动鼠标。你可以看到,蓝色的线条代表了你的鼠标的运行过程。

右上象限:红色的线条代表了经过过滤之后的鼠标运动。我不想跟踪距离非常短的运动,所以我只会显示距离大于20像素的运动。

左下象限:绿色的线条代表了另一种过滤之后的鼠标运动,我把鼠标的可能运动方向限制在了8个方向:上,下,左,右,和四个对角线。

右下象限:这里用于显示对绿色线条的文字描述,并删除了一些重复的运动,例如像“left left left right”将会变成"left left"。

  1. package {

            import flash.display.Sprite;

            import flash.events.MouseEvent;

            import flash.events.Event;

            import flash.text.TextField;

            public class gesture extends Sprite {

                    public var drawing:Boolean=false;

                    public var freemouse:Sprite=new Sprite();

                    public var stepmouse:Sprite=new Sprite();

                    public var dirmouse:Sprite=new Sprite();

                    public var the_grid:grid=new grid();

                    public var px,py,px2,py2:int;

                    public var directions:TextField=new TextField();

                    public var latest_direction:Number;

                    public function gesture():void {

                            addChild(the_grid);

                            addChild(freemouse);

                            addChild(stepmouse);

                            addChild(dirmouse);

                            addChild(directions);

                            stepmouse.x=250;

                            dirmouse.y=200;

                            directions.x=250;

                            directions.y=200;

                            directions.height=200;

                            addEventListener(Event.ENTER_FRAME,on_enter_frame);

                            stage.addEventListener(MouseEvent.MOUSE_DOWN,on_mouse_down);

                            stage.addEventListener(MouseEvent.MOUSE_UP,on_mouse_up);

                    }

                    public function on_mouse_down(e:MouseEvent):void {

                            if (! drawing) {

                                    directions.text="";

                                    latest_direction=-1;

                                    drawing=true;

                                    freemouse.graphics.clear();

                                    freemouse.graphics.lineStyle(1,0x0000ff);

                                    freemouse.graphics.moveTo(mouseX,mouseY);

                                    stepmouse.graphics.clear();

                                    stepmouse.graphics.lineStyle(1,0xff0000);

                                    stepmouse.graphics.moveTo(mouseX,mouseY);

                                    dirmouse.graphics.clear();

                                    dirmouse.graphics.lineStyle(1,0x00ff00);

                                    dirmouse.graphics.moveTo(mouseX,mouseY);

                                    px=px2=mouseX;

                                    py=py2=mouseY;

                            }

                    }

                    public function on_mouse_up(e:MouseEvent):void {

                            drawing=false;

                    }

                    public function on_enter_frame(e:Event):void {

                            if (drawing) {

                                    freemouse.graphics.lineTo(mouseX,mouseY);

                                    var dx=px-mouseX;

                                    var dy=py-mouseY;

                                    var distance:Number=dx*dx+dy*dy;

                                    if (distance>400) {

                                            stepmouse.graphics.lineTo(mouseX,mouseY);

                                            var angle:Number=Math.atan2(dy,dx)*57.2957795;

                                            var refined_angle:Number;

                                            var string_dir:String;

                                            if (angle>=22*-1&&angle<23) {

                                                    refined_angle=0;

                                                    string_dir="Left\n";

                                            }

                                            if (angle>=23&&angle<68) {

                                                    refined_angle=Math.PI/4;

                                                    string_dir="Up Left\n";

                                            }

                                            if (angle>=68&&angle<113) {

                                                    refined_angle=Math.PI/2;

                                                    string_dir="Up\n";

                                            }

                                            if (angle>=113&&angle<158) {

                                                    refined_angle=Math.PI/4*3;

                                                    string_dir="Up Right\n";

                                            }

                                            if (angle>=135angle<157*-1) {

                                                    refined_angle=Math.PI;

                                                    string_dir="Right\n";

                                            }

                                            if (angle>=157*-1&&angle<112*-1) {

                                                    refined_angle=- Math.PI/4*3;

                                                    string_dir="Down Right\n";

                                            }

                                            if (angle>=112*-1&&angle<67*-1) {

                                                    refined_angle=- Math.PI/2;

                                                    string_dir="Down\n";

                                            }

                                            if (angle>=67*-1&&angle<22*-1) {

                                                    refined_angle=- Math.PI/4;

                                                    string_dir="Down Left\n";

                                            }

                                            px2-=Math.sqrt(distance)*Math.cos(refined_angle);

                                            py2-=Math.sqrt(distance)*Math.sin(refined_angle);

                                            if (refined_angle!=latest_direction) {

                                                    directions.appendText(string_dir);

                                                    latest_direction=refined_angle;

                                            }

                                            dirmouse.graphics.lineTo(px2,py2);

                                            px=mouseX;

                                            py=mouseY;

                                    }

                            }

                    }

            }

    }

现在你差不多可以在你的代码中使用鼠标手势了......你只要添加一些Levenshtein distance调整就可以大功告成了

原文: http://www.emanueleferonato.com/2010/07/05/detecting-mouse-gestures-in-flash-with-as3/

时间: 2024-08-03 04:29:45

as3检测鼠标手势的相关文章

AS3的通用工具类库 GhostCat

GhostCatTools已经发布,使用Flex Spark框架以及AIR和部分GhostCat功能制作. 包含大量开发常用的功能. 下载地址:http://ghostcat.googlecode.com/svn/trunk/GhostCatTools/GhostCatTools.exe GhostCat是一个功能非常丰富的开源工具库,(同时也包含有一套完整的UI组件,但它只是类库的一个衍生品.) 它基本可以涵盖你可能遇到大部分问题. 使用UI将会增加50K左右的体积,使用非UI显示对象会增加2

常用的AS3开源类库

GreenShock Tween Platform GreenShock Tween是我最常用的一个功能强大的Tween类库,详细可以见我之前的介绍.但是要注意这个类库对商业项目并不是免费使用的,可以替代的选择有很多:GTween,Tweener等等. Bulk Loader Bulk Loader解决的是AS3中各种不同类型文件的加载问题,实现了对各种数据类型统一的加载接口,调用非常简便.此外还具有有批量加载.优先级设置等高级功能. Gaia Framework Gaia是一套完整的互动网站制

Flash Actionscript知识:从 AS2 到 AS3

常量 操作符 参数 随着Flash CS3正式版的发布,估计很多朋友都开始从AS2迁移到AS3了.不过AS3比AS2改变的实在太多,在as2中很多方法属性在as3中并不相同,甚至消失,而且目前帮助文档是E文的,现下的as3基础文章也并不多,因此特开此贴,集合一些基础性的要点,尽量以例子来说明,让大家更快更好的往AS3迁移.文中如有错误,敬请指正.有兴趣的朋友也可以一起来添加. 1.常量先看AS2代码:var str:String;var num:Number;var boo:Boolean;va

探索F9 As3.0 Preview

探索Flash Professional Actionscript 3.0 Preview 声明:本教程英文版源自Adobe的:http://www.adobe.com/devnet/flash/articles/flash9_as3_preview.html原作者:Jen deHaan和Peter deHaan本站对其进行了翻译整理,此教程转载请注明出处.并标有活动链接,谢谢合作. Adobe Flash Professional 9 ActionScript 3.0 Preview(以下简称

flash as3.0加载swf失败解决方法

flash as3.0加载swf代码怎么写?如已有1.swf,用2.fla加载,在2.fla里的代码怎么写 补充:2.fla里已有一段,加载1.swf是想放完2.fla前一段后接着放2.swf的.所以代码是要写到2.fla本身的最后一帧的吧   var my_urlloader:loader=new loader(); my_urlloader.load(new urlrequest("swf.swf")); my_urlloader.contentloaderinfo.addeven

AS3 拖动对象实现方法

as3 拖动对象实现方法 在flash as3.0里面 有startdrag 函数 mc.startdrag(false, new rectangle(0, 0, 100, 0) ); 这样mc这个元件只能在x轴方向拖动 拖动范围是 0-100 mc.startdrag(false, new rectangle(10, 20, 100, 200) ); 这样mc是可以在x方向10-100 y轴方向20-200 这样一个矩形区域拖动 希望对你有帮助 user1.addeventlistener(m

“AS3.0高级动画编程”学习:第三章等角投影(下)

在上一篇的最后,我们成功的用"等角投影"模拟出了立体空间的盒子模型,但是很快你就会发现这个示例的bug bug1:在已经有box的地方,再点击,将会重复创建box新实例. bug2:后面添加的box,会挡住前面添加的box. bug3:在边缘部分,如果用鼠标小心的点击,可以创建出很多超出world范围之外的盒子(即:看起来好象挂出去了) 我们按轻重缓急来处理吧: bug2最严重,它直接影响了最终的3D视觉效果.产生它的原因是显示列表中,后添加的物体,其index值会比 前面添加物体的i

检测鼠标离开Movie的动作

在以前的AS版本中,你无法做到检测鼠标是否还在Flash Movie上.因此影片不能检测到用户是否在关注着当前的Movie.另外一个问题是,如果使用了自定义的鼠标样式,在鼠标移出Movie后,自定义的鼠标还是继续停留在影片上,而不能正确的显示鼠标当前的位置. 现在,AS3允许你通过监听stage的mouseLeave行为来捕获鼠标移出Movie的动作.mouseLeave行为在鼠标移出Movie的时候执行.但是现在并没有mouseEnter事件,不过你可以通过使用mouseMove来设置. 下面

“AS3.0高级动画编程”学习:第一章高级碰撞检测

AdvancED ActionScript 3.0 Animation 是Keith Peters大师继"Make Things Move"之后的又一力作,网上已经有中文翻译版本了,打算下一阶段开始啃这本书. 今天开始学习高级碰撞检测,所用到的预备知识: 1.BitmapData的透明与不透明区别 位图数据(BitmapData)有二种模式,一种支持透明(即每个像素的值采用AARRGGBB这种32位颜色表示):另一种不支持透明度(即传统的RRGGBB这种24位颜色表示,简单点讲就是al