经过一段时间的学习,才发现CH5里scrollview的例子很少,也没有相关的SAMPLE,于是乎,开始投入研究。大多数scrollview的例子只有在cocos2d-x里才用到,那么CH5里要用到滚动条怎么理呢?有人说用tableview,OMG,这个玩意不但复杂而且累赘,用一个简单的功能要写一大堆代码。OK,哥与scrollview卯上了,最后终于完美解决。估计应该是全论坛首创,因此转载要注明出处。分享研究代码:
主要解决俩大难题:
1)滑动优先的问题,如果在scrollview里放Menu不能滑动,并且触发menu事件。
2)当menu滑动出ScrollView的时候,还可以点击。
解决方案:
1)重写Menu
var MyScrollMenu = cc.Menu.extend({
ctor : function () {
this._super();
cc.associateWithNative(this, cc.Layer);
if ('touches' in sys.capabilities || sys.platform == "browser")
this.setTouchEnabled(true);
else if ('mouse' in sys.capabilities)
this.setMouseEnabled(true);
},
registerWithTouchDispatcher : function () {
Global.director.getTouchDispatcher().addTargetedDelegate(this, cc.MENU_HANDLER_PRIORITY + 1000, true);
},
onTouchBegan : function (touch, e) {
this.touchPY1 = touch.getLocation().y;
if (this._state != cc.MENU_STATE_WAITING || !this._visible || !this._enabled) {
return false;
}
for (var c = this._parent; c != null; c = c.getParent()) {
if (!c.isVisible()) {
return false;
}
}
this._selectedItem = this._itemForTouch(touch);
if (this._selectedItem) {
this._state = cc.MENU_STATE_TRACKING_TOUCH;
this._selectedItem.selected();
return true;
}
},
onTouchMoved : function (touch, e) {
this.touchPY2 = touch.getLocation().y;
if (Math.abs(this.touchPY1 - this.touchPY2) > 0 && this._selectedItem) {
this._selectedItem.unselected();
this._selectedItem = null;
}
},
onTouchEnded : function (touch, e) {
if (this._selectedItem) {
this._selectedItem.unselected();
this._selectedItem.activate();
Global.audioEngine.playEffect(Res.Sounds.Main.click);
}
this._state = cc.MENU_STATE_WAITING;
}
});
MyScrollMenu.create = function () {
var ret = new MyScrollMenu();
if (arguments.length == 0) {
ret.initWithItems(null, null);
} else if (arguments.length == 1) {
if (arguments[0]instanceof Array) {
ret.initWithArray(arguments[0]);
return ret;
}
}
ret.initWithItems(arguments);
return ret;
};
2)添加点击范围判断:
var scrollViewTestLayer = cc.Layer.extend({
ctor : function () {
this._super();
cc.associateWithNative(this, cc.Layer);
if ('touches' in sys.capabilities || sys.platform == "browser")
this.setTouchEnabled(true);
else if ('mouse' in sys.capabilities)
this.setMouseEnabled(true);
var container = cc.LayerColor.create(cc.c4b(0, 0, 255, 255), 320, 360);
container.addChild(new MyScrollMenu() );