经过一段时间的学习,才发现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() );
var scrollView = cc.ScrollView.create(cc.size(320, 300), container);
scrollView.setBounceable(true);
scrollView.setDirection(1);
scrollView.updateInset();
scrollView.setPosition(cc.p(0, 120));
scrollView.setContentOffset(cc.p(0, 0), true);
//scrollView.ignoreAnchorPointForPosition(false);
scrollView.setDelegate(this);
this.addChild(scrollView);
},
registerWithTouchDispatcher : function () {
Global.director.getTouchDispatcher().addTargetedDelegate(this, cc.MENU_HANDLER_PRIORITY - 100, true);
},
onTouchBegan : function (touch, e) {
//cc.log(touch.getLocation());
if (cc.rectContainsPoint(cc.rect(0, 120, 320, 300), touch.getLocation())) {
//cc.log(111111);
return false;
} else {
//cc.log(222222);
return true;
}
},
scrollViewDidScroll : function (view) {
//cc.log('scrollViewDidScroll');
},
scrollViewDidZoom : function (view) {
//cc.log('scrollViewDidZoom');
}
});
这些代码是经过好几天的研究得到的,请大家尊重别人的劳动成果,转载标明出处,谢谢。