[AS3]as3中的单击双击事件源代码
有一天,策划提了个这样的需求,在游戏背包中,如果仓库界面打开的情况下,单击物品则弹出操作菜单,如果是双击的话直接存储到仓库中。
我想,这还不简单嘛,物品监听鼠标的MouseEvent.CLICK和MouseEvent.DOUBLE_CLICK两个事件不就行了嘛,然后分别处理对应的事件,我就开始敲代码了。
- package {
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.MouseEvent;
- public class Main extends Sprite {
- public function Main() {
- if (stage)onInit();
- else stage.addEventListener(Event.ADDED_TO_STAGE, onInit);
- }
- private function onInit(event:Event = null):void {
- stage.removeEventListener(Event.ADDED_TO_STAGE, onInit);
- stage.addEventListener(MouseEvent.CLICK, onClickHandler);
- stage.doubleClickEnabled=true;
- stage.addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClickHandler);
- }
- private function onDoubleClickHandler(event:MouseEvent):void {
- trace("酷播cuplayer.com双击放入仓库");
- }
- private function onClickHandler(event:MouseEvent):void {
- trace("酷播cuplayer.com单击弹出操作菜单");
- }
- }
- }
运行完后发现有问题,当我单击时,可以正确响应单击事件,但是当我双击时,不仅会响应双击事件,而且还会响应单击事件。就是原本我想双击放入仓库的,确实 有放入仓库,但是又弹出了操作菜单。原来是触发MouseEvent.DOUBLE_CLICK事件前会触发MouseEvent.CLICK事件,那有 没有办法不让双击时触发单击事件呢,查询了资料后发现没有办法改变flash本身的这个机制,那只能另辟蹊径了。下面是我的方法,原理很简单,就是判断在 很短的时间内,是单击了一下呢还是单击了两次。代码如下。
- package {
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.MouseEvent;
- import flash.utils.clearTimeout;
- import flash.utils.setTimeout;
- public class DoubleClick extends Sprite {
- private static const DOUBLE_CLICK_SPEED = 300;
- //双击事件的处理时间
- public function DoubleClick() {
- if (stage)onInit();
- else stage.addEventListener(Event.ADDED_TO_STAGE, onInit);
- }
- private var click_once:Boolean;
- private var time_id:uint;
- private function onInit(event:Event = null):void {
- stage.removeEventListener(Event.ADDED_TO_STAGE, onInit);
- stage.addEventListener(MouseEvent.CLICK, onMouseHandler);
- stage.doubleClickEnabled = true;
- stage.addEventListener(MouseEvent.DOUBLE_CLICK, onMouseHandler);
- }
- private function onMouseHandler(event:MouseEvent):void {
- if (time_id) {
- //如果time_id为true的话说明在300毫秒已经单击过了一次
- clearTimeout(time_id);
- onDoubleClickHandler();
- } else {
- //如果300毫秒后没有再次单击的话则调用单击事件
- time_id = setTimeout(onClickHandler, DOUBLE_CLICK_SPEED);
- }
- }
- private function onClickHandler():void {
- trace("单击弹出操作菜单");
- //单击完成后要初始化为0
- time_id=0;
- }
- private function onDoubleClickHandler():void {
- trace("双击放入仓库");
- }
- }
- }
现在可以正确响应单双击事件了,美中不足的一个是如果是单击的话,会有一点延迟的感觉,没有直接响应MouseEvent.CLICK事件来的灵敏,不过人无完人,这么点延迟还是可以接受的吧。
本文出自 unityas,转载时请注明出处及相应链接。
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例