cocos2d scrollview上面添加按钮 50
我在scrollview的item上面添加按钮,当item滑动到scrollview的可视范围之外的时候,我在scrollview可视范围外面点击原本已经隐藏的item上...
我在scrollview的item上面添加按钮,当item滑动到scrollview的可视范围之外的时候,我在scrollview可视范围外面点击原本已经隐藏的item上面的按钮,按钮仍然能接收到点击事件,这是什么原因引发的,有何好的解决方案。
展开
展开全部
且看 CCMenu 的touchbegan函数:
bool CCMenu::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
CC_UNUSED_PARAM(event);
if (m_eState != kCCMenuStateWaiting || ! m_bVisible || !m_bEnabled)
{
return false;
}
for (CCNode *c = this->m_pParent; c != NULL; c = c->getParent())
{
if (c->isVisible() == false)
{
return false;
}
}
m_pSelectedItem = this->itemForTouch(touch);
if (m_pSelectedItem)
{
m_eState = kCCMenuStateTrackingTouch;
m_pSelectedItem->selected();
return true;
}
return false;
}
touchbegan时响应点击事件的一部分因素在于那个for循环,只有当前menu的所有父节点可见时,才能继续响应点击事件。
除此之外,当该menu可见时,那么该menu就会遍历左右的children,且看
CCMenuItem* CCMenu::itemForTouch(CCTouch *touch)
{
CCPoint touchLocation = touch->getLocation();
if (m_pChildren && m_pChildren->count() > 0)
{
CCObject* pObject = NULL;
CCARRAY_FOREACH(m_pChildren, pObject)
{
CCMenuItem* pChild = dynamic_cast<CCMenuItem*>(pObject);
if (pChild && pChild->isVisible() && pChild->isEnabled())
{
CCPoint local = pChild->convertToNodeSpace(touchLocation);
CCRect r = pChild->rect();
r.origin = CCPointZero;
if (r.containsPoint(local))
{
return pChild;
}
}
}
}
return NULL;
}
当且仅当 if (pChild && pChild->isVisible() && pChild->isEnabled()) Child存在 可见 使能 时就会响应对应的点击时间。
于是,又根据cocos2d touch事件的分发规则,先响应优先级高的layer,然后menu就先响应点击了。
bool CCMenu::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
CC_UNUSED_PARAM(event);
if (m_eState != kCCMenuStateWaiting || ! m_bVisible || !m_bEnabled)
{
return false;
}
for (CCNode *c = this->m_pParent; c != NULL; c = c->getParent())
{
if (c->isVisible() == false)
{
return false;
}
}
m_pSelectedItem = this->itemForTouch(touch);
if (m_pSelectedItem)
{
m_eState = kCCMenuStateTrackingTouch;
m_pSelectedItem->selected();
return true;
}
return false;
}
touchbegan时响应点击事件的一部分因素在于那个for循环,只有当前menu的所有父节点可见时,才能继续响应点击事件。
除此之外,当该menu可见时,那么该menu就会遍历左右的children,且看
CCMenuItem* CCMenu::itemForTouch(CCTouch *touch)
{
CCPoint touchLocation = touch->getLocation();
if (m_pChildren && m_pChildren->count() > 0)
{
CCObject* pObject = NULL;
CCARRAY_FOREACH(m_pChildren, pObject)
{
CCMenuItem* pChild = dynamic_cast<CCMenuItem*>(pObject);
if (pChild && pChild->isVisible() && pChild->isEnabled())
{
CCPoint local = pChild->convertToNodeSpace(touchLocation);
CCRect r = pChild->rect();
r.origin = CCPointZero;
if (r.containsPoint(local))
{
return pChild;
}
}
}
}
return NULL;
}
当且仅当 if (pChild && pChild->isVisible() && pChild->isEnabled()) Child存在 可见 使能 时就会响应对应的点击时间。
于是,又根据cocos2d touch事件的分发规则,先响应优先级高的layer,然后menu就先响应点击了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询