CocosStudio控件的显示和隐藏

在开发中经常要根据改变按钮等控件的显示状态和触摸事件,有两种方法一种是
1.setEnabled()
2.setVisible() 和 setTouchEnabled()
最初只是认为setEnabled = setTouchEnabled()和setVisible().
有时候在底层设置了通过设置setEnabled(false) 隐藏了控件并不可触摸,但有时还是没有生效。
UIWidget代码如下:

void Widget::setEnabled(bool enabled)
{
    _enabled = enabled;
    if(_widgetChildren && _widgetChildren->count() > 0)
    {
        CCObject* child;
        CCARRAY_FOREACH(_widgetChildren, child)
        {
            ((Widget*)child)->setEnabled(enabled);
        }
    }
}

实际上已经生效,只是如果父节点设置了setEnabled(true),则会遍历所有子节点并设置设置_enable = true,所以无效。

此外还有个问题,就是有时候通过setEnabled(false)隐藏控件,要显示时调用setVisible(true) 和 setTouchEnabled(true)确无效。

void Widget::visit()
{
    if (_enabled)
    {
        CCNode::visit();
    }    
}

控件的显示是通过visit来绘制的,如果_enabled == false 则不去绘制。就无法显示。
至于触摸事件:

Widget::Widget():
_enabled(true),
_bright(true),
_touchEnabled(false),
...
bool Widget::onTouchBegan(CCTouch *touch, CCEvent *unused_event)
{
    _hitted = false;
    if (isEnabled() && isTouchEnabled())
    {
        _touchStartPos = touch->getLocation();
        if(hitTest(_touchStartPos) && clippingParentAreaContainPoint(_touchStartPos))
        {
            _hitted = true;
        }
    }
   ...
}

在begin中做了enable和_touchEnabled的与的判断。 所以如果是setEnabled()禁止了触摸事件,要恢复还是要通过setEnable().

综上:如果要设置子空间控件的隐藏和显示,推荐使用setVisible()和setTouchEnabled().

你可能感兴趣的:(CocosStudio控件的显示和隐藏)