creator 1.3.3
现在有需求,需要在slider滑动的开始和结束期间做一些表现。
监听slide只是知道滑动过程,如何获取滑动结束的事件?自己写一个额外的监听也可以,但是如果能直接获取到的话就没有必要做额外的消耗,所以,请问,除了自己做个监听外还有获取方法么,比如从slide的滑动事件中能抽取结束事件么?
自己监听的话,除了你说的这个,还需要获取handle那个滑动点的点击事件,因为点击handle的时候是获取不到touchEnd事件的。这样的做法可以是可以,但是感觉这些最好能从slide事件里面去获取。。。
handle是cc.Button啊,有事件列表啊,当touchended的时候会发送事件,调用回调函数,touchended就是滑动结束了吧?
我书读的比较少,没有看懂
你自己点下就知道了,handle这个button在上面,注册的touchEnd的事件是button下面的slider的,所以你点在handle的时候,自己主动注册在slider上的touchEnd事件接收不到
所以我说,需要接收handle的touchEnd和slider的touchEnd才能正常处理这个事情,希望官方能加到slide里面吧,不然感觉挺繁琐的。
handle本身就挂载有cc.Button组件啊
这是注册事件的源代码
_registerEvent: function () {
this.node.on(cc.Node.EventType.TOUCH_START, this._onTouchBegan, this);
this.node.on(cc.Node.EventType.TOUCH_MOVE, this._onTouchMoved, this);
this.node.on(cc.Node.EventType.TOUCH_END, this._onTouchEnded, this);
this.node.on(cc.Node.EventType.TOUCH_CANCEL, this._onTouchCancelled, this);
if (this.handle && this.handle.isValid) {
this.handle.node.on(cc.Node.EventType.TOUCH_START, this._onHandleDragStart, this);
this.handle.node.on(cc.Node.EventType.TOUCH_MOVE, this._onTouchMoved, this);
this.handle.node.on(cc.Node.EventType.TOUCH_END, this._onTouchEnded, this);
}
},
handle上的事件列表,添加到列表的回调函数会在handle touchended的时候调用,handle touchended的时候slider也就touchended了吧?

你是想监听handle的touchended还是slider的touchended?handle的touch事件不可能和slider的touch事件不一样吧?
谢谢,你说的对,我先前是想错了。
只是这个handle里面的touchEnd如何使用我没头绪,如何获取事件列表,知道什么时候进入了touchEnd,能否详细点告诉我应该怎么做?
事件列表就在编辑器啊,每个button组件都有一个事件列表啊


下午我测试的时候是只有touchended会调用回调,我刚刚看了源码,button组件只在touchended里调用回调函数,也就是说你的回调函数被调用的时候就是handle的touchended了
不用客气
昨天的问题解决了,点击handle移动进度条的时候,能够在handle的button事件中获取滑动结束的时机,直接点击进度条背景来移动进度条的时候,可以在slider上增加一个touchEnd的监听来获取滑动结束的时机。。。。
还有一个问题,那就是如何禁用slider。现在需要在某个状态的时候,不允许玩家继续对slider进行操作,但是在官方文档和api中并没有找到什么可行的方案,总不可能直接在上面增加一个触摸吞噬的层吧。。。。
你试试看禁用的时候用 cc.eventManager.pauseTarget(sliderNode)
要恢复操作的时候用cc.eventManager.resumeTarget(sliderNode)
应该可以这样
this._sliderComp = this.node.getComponent(cc.Slider); cc.eventManager.pauseTarget(this.node); cc.eventManager.pauseTarget(this._sliderComp.node); for(var i = 0; i < this.node.children.length; i ++){ cc.eventManager.pauseTarget(this.node.children[i]); }
但是,并没有效果,要哭。。。。
马上我试试看
我的错…pauseTarget和resumeTarget的参数都有有两个,一个是事件监听的node,还有第二个参数,我不知道是什么,但是传true就行了
this._sliderComp = this.node.getComponent(cc.Slider);
cc.eventManager.pauseTarget(this.node, true);
cc.eventManager.pauseTarget(this._sliderComp.node ,true);
for(var i = 0; i < this.node.children.length; i ++){
cc.eventManager.pauseTarget(this.node.children[i], true);
}
这样就ok了
兄弟,这个还是不行,你亲自试试就知道了,我用的是google浏览器看效果。
现在我暂时使用的解决方案是,是在slider上面增加一个同样大小的吞噬层,不让他点击到下面。哎,不知道下个版本的slider会不会更好用些。。。
谢谢你这么尽心地回答我的问题,应该是版本原因吧,我这里用的是1.3.3,运行你的demo还是达不到禁用slider的效果。
这个问题就先这样了,等更新到1.4我再使用你的方案。





pauseTarget和resumeTarget第二个参数的意思是,是否递归pause或resume所有子节点。传true的话就会把所有子节点都pause或resume了。
