CocosStudio控件的顯示和隱藏

在開發中常常要根據改變按鈕等控件的顯示狀態和觸摸事件,有兩種方法一種是 1.setEnabled() 2.setVisible() 和 setTouchEnabled() 最初只是認爲setEnabled = setTouchEnabled()和setVisible(). 有時候在底層設置了經過設置setEnabled(false) 隱藏了控件並不可觸摸,但有時仍是沒有生效。 UIWidget代碼以下:code

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)確無效。ip

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().get

綜上:若是要設置子空間控件的隱藏和顯示,推薦使用setVisible()和setTouchEnabled().it

相關文章
相關標籤/搜索