视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
cocos2dx3.X触摸吞噬功能
2020-11-09 08:09:38 责编:小采
文档


对话框是什么,大家应该比较清楚。模态对话框就是当前对话框出现的时候不能对当前对话框以外的元素进行操作的一种对话框。 cocos里面是不自带对话框的,所以需要自己制作。一般都是新建一个层,覆盖在当前场景之上。 但是这时候常常会有一个问题,就是覆盖之

对话框是什么,大家应该比较清楚。模态对话框就是当前对话框出现的时候不能对当前对话框以外的元素进行操作的一种对话框。

cocos里面是不自带对话框的,所以需要自己制作。一般都是新建一个层,覆盖在当前场景之上。

但是这时候常常会有一个问题,就是覆盖之后,下层的点击操作依然会被相应。

这个问题我以前的做法比较naive(当然也是一种方法),就是每次把下层场景的控件都传到上层中然后 setEnable(false) 掉。但是。。太麻烦了。


今天才知道可以在上层对话框层实现触摸吞噬,就是将所有触摸操作拦截在当前层不让其在下层有所响应。

3.X 中,因为事件处理机制的变化,需要实现一个(listener)对当前层触摸操作监听并阻止其向下层传播的过程。

代码如下(一般是写在对话框层的 init 函数中)。如果在对话框层中加入,listener 需要固定在 this 上;如果在对话框下一层加入 listener 则要把对话框层的实例(也就不是 ths了)固定 listener:

	auto listener = EventListenerTouchOneByOne::create();
	listener->setSwallowTouches(true);
	listener->onTouchBegan = [](Touch* touch, Event* event)
	{
	return true;
	};
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

讲解一下。也可以看这里:
  1. setSwallowTouches 是本层是不是要拦截所有触摸事件,true 就是要拦截;
  2. onTouchBegan 一般是用来处理触摸事件,这里将其写空,只是让它 return 一个值。

    (1)如果返回true,则本层的Touch事件可以被触发,并阻挡向后层传递(自己可以用,不让下层用);

    (2)如果返回false,本层的后续Touch事件不能被触发,并向后传递。

  3. addEventListenerWithSceneGraphPriority 是添加的函数,当然也可以写作 addEventListenerWithFixedPriority。区别就是:

    (1)addEventListenerWithSceneGraphPriority 的事件优先级是0,而且在 addEventListenerWithFixedPriority 中的事件的优先级不可以设置为 0,因为这个是保留给 SceneGraphPriority 使用的;

    (2)另外,有一点非常重要,FixedPriority listener添加完之后需要手动remove,而SceneGraphPriority listener是跟node绑定的,在node的析构函数中会被移除。

  4. _eventDispatcher 是cocos内置的事件分发器,无需声明直接使用就好。

下载本文
显示全文
专题