cocos2d-x jsb 防止触摸事件传递
在游戏中要实现消息弹窗,让用户点击确认,其他区域产生遮罩,阻挡下层的事件被点击到,这是个很常用的功能,在cocos2d-x中,可以通过为layer添加事件代理来实现:
pDirector->getTouchDispatcher()->addTargetedDelegate(this, priority, swallowsTouches);
三个参数分别是要添加触摸事件的node, 事件优先级(默认的-128, 是最小的数字, 具有最高优先级),是否吞噬触摸事件(true为停止事件传递)
这里简单说下2dx中的事件传递模型,这应该也是 2dx被开发者吐槽最多的地方:
* 2dx中的事件代理分为标准代理(addStandardDelegate)和目标代理(addTargetedDelegate);
* 标准代理是部分node默认的属性,通过setTouchEnbled开启和关闭,有四个实现接口: onTouchesBegan, onTouchesMoved, onTouchesEnded, onTouchesCancelled
* 目标代理代理事件可以自定义给node, 通过上述 addTargetedDelegate开启, 同样也有四个实现接口:onTouchBegan... (注意此处没有es, 而且began函数需要返回true or false, false的话,后续moved, ended等将不会生效);
* 一个触摸事件被接受后,从优先级高的开始逐个触发, 遇到swallows, 则停止;
但是在cocos2d-x js binding中没有实现addTargetDelegate的绑定, demo中都不能使用, 即使是最新的2.1.4版本也没有,遇到了些问题,让这个绑定一直延迟发布,有兴趣可以看这里:https://groups.google.com/forum/#!msg/cocos2d-js-devel/pKycy8iI1n4/Cn8KI5Or_PgJ
在jsb中有个替代的实现:cc.registerTargettedDelegate(priority, swallowsTouches, this);
虽然和cocos2d-html5的接口不同,但是可以先使用, 具体使用如下:
为遮罩层之上的菜单添加最高优先级, 为遮罩层设置目标触摸事件的代理, 实现onTouchBegan的接口,注意这里需要返回true, 否则 swallowsTouches不会生效;
var menuGroup = cc.Menu.create(btn1, btn2);
menuGroup.setTouchPriority(cc.MENU_HANDLER_PRIORITY-2);
cc.registerTargettedDelegate(cc.MENU_HANDLER_PRIORITY-1, true, confirmLayer);
confirmLayer.onTouchBegan = function(){cc.log("touches confirm layer! block touchEvent bubble!");return true;};
最后,在结束该窗体后,记得调用:
cc.unregisterTouchDelegate(confirmLayer);
=================================
备注:对于cocosbuilder上创建的layer, 使用registerTargettedDelegate会遇到控制问题,暂时先使用脚本创建;
Good Luck !
cocos2d-x jsb 防止触摸事件传递的更多相关文章
- iOS 和 Android 触摸事件传递
先看文章,写得很好 ios 触摸事件传递 http://www.cnblogs.com/Quains/p/3369132.html 另外一篇 http://blog.csdn.net/yongyinm ...
- UIView的clipsToBounds属性,layoutSubViews及触摸事件传递(默认情况下)总结
一.UIView的clipsToBounds属性 * 默认情况下,超出父控件尺寸范围的子控件还是可见的 * 如果设置父控件的clipsToBounds=YES,就会裁剪掉超出父控件尺寸范围内的子控件, ...
- Android触摸事件传递机制
简单梳理一下Android触摸事件传递机制的知识点. 一.View与ViewGroup的关系 View和ViewGroup二者的继承关系如下图所示: View是Android中最基本的一种UI组件,它 ...
- Android触摸事件传递机制,这一篇就够了
整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...
- 初识Android触摸事件传递机制
前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...
- Android_触摸事件传递机制
Android中dispatchTouchEvent,onInterceptTouchEvent, onTouchEvent的理解ecandroid中的事件类型分为按键事件和屏幕触摸事件,Touch事 ...
- Android: 详解触摸事件如何传递
当视图的层次结构比较复杂的时候,触摸事件的响应流程也变得复杂. 举例来说,你也许有一天想要制作一个手势极其复杂的 Activity 来折磨你的用户,你经过简单思索,认为其中应该包含一个 PageVie ...
- Android触摸事件流程剖析
Android中的触摸事件流程就是指MotionEvent如何传递,主要包括两个阶段: onInterceptTouchEvent触摸事件拦截方法传递,从外到里传递 onTouchEvent触摸事件处 ...
- 图解Android触摸事件分发
Android中触摸事件传递过程中最重要的是dispatchTouchEvent().onInterceptTouchEvent()和onTouchEvent()方法. View和Activity有d ...
随机推荐
- android 与usb 设备通信(二)
再次遇到android mUsbManager.getDevicelist() 得不到usb 设备的问题.于是深入去探讨android 与usb 外围设备通信的问题.第一篇文章写的有点乱,本质就是需 ...
- 170. Two Sum III - Data structure design
题目: Design and implement a TwoSum class. It should support the following operations: add and find. a ...
- Spring 3.x企业应用开发实战(14)----事务
Spring虽然提供了灵活方便的事务管理功能,但这些功能都是基于底层数据库本身的事务处理机制工作的.要深入了解Spring的事务管理和配置,有必要先对数据库事务的基础知识进行学习. 何为数据库事务 “ ...
- What is martian source / martian packets
Martian source / Martian packets In Linux, by default, packets are considered individually for routi ...
- 【HDOJ】3909 Sudoku
DLX的应用,基本题,注意maxnode开大点儿. /* 3909 */ #include <iostream> #include <string> #include < ...
- 【HDOJ】3337 Guess the number
神一样的题目.简言之,利用手段获得测试用例的第一行,输出结果.很显然利用wa, TLE, OLE等judge status可以获得测试用例.因此,果断Python写一个acm提交机器人.依赖lxml库 ...
- Sum of Digits / Digital Root
Sum of Digits / Digital Root In this kata, you must create a digital root function. A digital root i ...
- 关于数组和List之间相互转换的方法
1.List转换成为数组:返回数组的运行时类型.如果列表能放入指定的数组.否则,将根据指定数组.如果指定的数组的元素比列表的多),那么会将存储列表元素的数组. 返回:包含列表元素的list.add(& ...
- POJ_3258_River_Hopscotch_[NOIP2015]_(二分,最大化最小值)
描述 http://poj.org/problem?id=3258 给出起点和终点之间的距离L,中间有n个石子,给出第i个石子与起点之间的距离d[i],现在要去掉m个石子(不包括起终点),求距离最近的 ...
- Linux内核与根文件系统的关系
开篇题外话:对于Linux初学者来说,这是一个很纠结的问题,但这也是一个很关键的问题! 一语破天机: “尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用的主要工具.这 ...