求一个scrollView 的使用方法

如题 谢谢 大大们 想用scrollView 做个背包

用pageView+Layout啊。

或者Cocos Studio ,这有现成的:http://www.cocoachina.com/bbs/read.php?tid=187115

是要动态添加的效果 上下拖拽 就刀塔传奇那样的背包

scrollview = ScrollView::create();
scrollview->setSize(Size(388.0f, 388.0f));
scrollview->setPosition(Vec2(228, 90));
scrollview->setBounceEnabled(true);
this->addChild(scrollview);

auto image = ImageView::create("ui/Status_equip/Character/UI01/_0015_ku01.png");

float innerWidth = scrollview->getSize().width;
float  innerHight = scrollview->getSize().height + image->getSize().height;
    scrollview->setInnerContainerSize(Size(innerWidth, innerHight));
          auto frame = ImageView::create("ui/Status_equip/Character/UI01/_0015_ku01.png");
    frame->setName(s1);
    frame->addTouchEventListener(CC_CALLBACK_2(UIPack::Image, this));
    
    frame->setPosition(Vec2(image->getSize().width / 2.0f + (image->getSize().width+3.0f) *line, innerHight - image->getSize().height / 2.0f - col*(frame->getSize().height + 3.0f                )));
    scrollview->addChild(frame);

红色部分是这个添加侦听吗?

我手里有个自己弄的的2.x版本的背包,等我回家之后找一下贴给你

#ifndef __Maxdilis__BagView__
#define __Maxdilis__BagView__

#include 
#include "cocos2d.h"
#include "cocos-ext.h"
#include "Defines.h"
#include "GameDataModel.h"

USING_NS_CC;
USING_NS_CC_EXT;

using namespace std;

class BagView :
public CCLayer,
public CCScrollViewDelegate,
public extension::CCBSelectorResolver,
public extension::CCBMemberVariableAssigner
{
public:
    CCDictionary *bagDic;
    int bagType;
public:
    virtual bool init();
    virtual void onEnter();
    virtual void onExit();
    
    void initBagViewData(CCSize viewSize, int bagIndex, CCObject* target, SEL_MenuHandler gridItemCallback);
    
    void setBagViewData(CCDictionary *bagData, int bagType);
    
    void refreshBagView(bool isReposition, int selectedTag = -1);
    CCNode* generateBagItem();
    
    void setGridTouchedMenuSelector();
    
    void gridItemTouchedCallback(CCObject *pSender);
    
    
    void tab1SelectedCallback();
    void tab2SelectedCallback();
    void tab3SelectedCallback();
    
    void chbxShowAvailbleCallback(CCObject *pSender);
    void chbxUnknownCallback(CCObject *pSender);
    
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(BagView, create);
    virtual SEL_MenuHandler onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char * pSelectorName);
    virtual extension::SEL_CCControlHandler onResolveCCBCCControlSelector(CCObject * pTarget, const char * pSelectorName);
    virtual bool onAssignCCBMemberVariable(CCObject * pTarget, const char * pMemberVariableName, CCNode * pNode);
    
    
    virtual void scrollViewDidScroll(CCScrollView* view);
    virtual void scrollViewDidZoom(CCScrollView* view);

    virtual void registerWithTouchDispatcher(void);
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
    
private:
    CCLayer *contentLayer;
    CCObject *selectorTarget;
    SEL_MenuHandler selector;
    
public:
    CCMenu *checkBoxMenu;
    CCMenu *tabsMenu;
    CCScrollView *scrollView;
    
    CCLabelTTF *tab1WordNormal;
    CCLabelTTF *tab1WordSelected;
    CCLabelTTF *tab2WordNormal;
    CCLabelTTF *tab2WordSelected;
    CCLabelTTF *tab3WordNormal;
    CCLabelTTF *tab3WordSelected;
    
};

class BagViewLoader : public extension::CCNodeLoader{
    
public:
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(BagViewLoader, loader);
    
protected:
    CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(BagView);
    
};

class BagViewCreator : public CCNode{
public:
    
    CCNode* createBagView();
    
};


#endif 


```



cpp文件


//
//  BagView.cpp
//  Maxdilis
//
//  Created by Harris on 13-12-21.
//
//

#include "BagView.h"
#include "GameManager.h"
#include "ScrollMenu.h"
bool BagView::init(){
    if(!CCLayer::init()){
        return false;
    }
    

    // init some background img
    
    // ////////////////////////
    
    contentLayer = CCLayer::create();
    
    scrollView = CCScrollView::create();
    scrollView->setAnchorPoint(CCPointZero);
    scrollView->setPosition(ccp(21, 64));
    scrollView->setContainer(contentLayer);
    scrollView->setViewSize(CCSizeMake(335, 335));
   //    scrollView->setContentOffset(ccp(0, 0));
    
    checkBoxMenu = NULL;
    tabsMenu = NULL;
  //  scrollView = NULL;
    
    tab1WordNormal = NULL;
    tab1WordSelected = NULL;
    tab2WordNormal = NULL;
    tab2WordSelected = NULL;
    tab3WordNormal = NULL;
    tab3WordSelected = NULL;
    
    scrollView->setDirection(kCCScrollViewDirectionVertical);
    scrollView->setDelegate(this);
    this->addChild(scrollView, 100);
    this->setTouchEnabled(true);
    
    return true;
}
void BagView::onEnter(){
    CCLayer::onEnter();
    //scrollView->setContainer(this->contentLayer);
    //scrollView->setDelegate(this);
    //scrollView->setBounceable(true);
    //scrollView->setTouchEnabled(true);
    //scrollView->setTouchPriority(-20);
}
void BagView::onExit(){
    CCLayer::onExit();
}

void BagView::gridItemTouchedCallback(CCObject *pSender){
    CCMenuItem *crntItem = (CCMenuItem*) pSender;
    if(crntItem->isSelected()){
        CCLog("Current item tag is %d", crntItem->getTag());
    }else{
        CCLog("Cancelled");
    }

}

void BagView::initBagViewData(CCSize viewSize, int bagIndex, CCObject *target, SEL_MenuHandler gridItemCallback){
    //itemList->setViewSize(viewSize);
    //crntBag = (CCArray*) GameManager::getInstance()->bagArray->objectAtIndex(bagIndex);
    this->selectorTarget = target;
    this->selector = gridItemCallback;
}

void BagView::setBagViewData(CCDictionary *bagData, int bagType){

    this->bagDic = bagData;
    this->bagType = bagType;
}

void BagView::refreshBagView(bool isReposition, int selectedTag){


    int equipBagNum = 0;
    if(bagType == ITEM_TYPE_EQUI){
        equipBagNum = GameManager::getInstance()->playerData->bag_equip_num;
    }else if(bagType == ITEM_TYPE_MATERIAL){
        equipBagNum = GameManager::getInstance()->playerData->bag_material_num;
    }else{
        equipBagNum = GameManager::getInstance()->playerData->bag_use_num;
    }
    
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    CCArray *gridArray = CCArray::create();
    
    // grid item尺寸
    // CCSprite *tempItemSprite = CCSprite::create("BagScene/bag_cell.png");
    CCSprite *tempItemSprite = CCSprite::create("awesomeFrame/grid_empty.png");
    float item_width = tempItemSprite->getContentSize().width;
    float item_height = tempItemSprite->getContentSize().height;
    
    tempItemSprite->release();
    
    // grid item x间距与y间距
    float gap_Xwidth = 10;  //(winSize.width - item_width*5) / 6;
    float gap_Ywidth = 10;  //(winSize.height - item_height*7) / 8;
    
    // 1st item 起始坐标
    float stage_begainXPos = gap_Xwidth+item_width/2;
    float stage_begainYPos = winSize.height - item_height/2;// (do NOT DELETE this:gap_Ywidth+item_height/2);
    
    int layerContentHeight = (item_height+gap_Ywidth)* ( (int) ( (float) /*equipBagNum*/bagDic->count()/4 + 0.5) ) + gap_Ywidth;
    
    
    
//    for(int i=0; iobjectForKey(i)){

        BagItemEquipment *crntEqui = (BagItemEquipment *) ele->getObject();// (BagItemModelBase*) bagDic->objectForKey(i);
            
            int itemType = crntEqui->item_type;
            
            switch (itemType) {
                    
                case ITEM_TYPE_EQUI:{
                    // create item image
                    item = CCSprite::createWithSpriteFrameName(crntEqui->imgPath.c_str());
                    item_copy = CCSprite::createWithSpriteFrameName(crntEqui->imgPath.c_str());
                    
                    // create partner head image (if current equip is weared by partner)
                    /*  TODO:  NEW LOGIC
                    BagItemEquipment *itemEquip = (BagItemEquipment *) crntEqui;
                    if(!itemEquip->wearerId.empty()){
                    
                        string partnerImgPath;
                        CCArray *partner = GameManager::getInstance()->partners;
                        for(int i=0; icount(); i++){
                            CharactorProperty *crntPartner = (CharactorProperty *) partner->objectAtIndex(i);
//                            if(crntPartner->cId == itemEquip->wearerId){
                                partnerImgPath = crntPartner->img;
                                break;
//                            }
                        }
                        
                        wearer_headImg = CCSprite::createWithSpriteFrameName(partnerImgPath.c_str());
                        wearer_headImg_copy = CCSprite::createWithSpriteFrameName(partnerImgPath.c_str());
                        wearer_headImg->setScale(0.3f);
                        wearer_headImg_copy->setScale(0.3f);
                        wearer_headImg->setPosition(ccp(crnt_gridItem->getContentSize().width - wearer_headImg->getContentSize().width * 0.3f /2,
                                                        wearer_headImg->getContentSize().height * 0.3f /2));
                        wearer_headImg_copy->setPosition(ccp(crnt_gridItem_selected->getContentSize().width -
                                                             wearer_headImg->getContentSize().width * 0.3f/2,
                                                             wearer_headImg->getContentSize().height * 0.3f/2));
                        
                    }*/
                    
                    break;
                }
                case 2:{
                    break;
                }
                case 3:{
                    break;
                }
                default:{
                    CCAssert(itemType, "unexpected item type");
                    break;
                }
            }
            item->setPosition(ccp(crnt_gridItem->getContentSize().width/2, crnt_gridItem->getContentSize().height/2));
            item_copy->setPosition(ccp(crnt_gridItem->getContentSize().width/2, crnt_gridItem->getContentSize().height/2));
            
            crnt_gridItem->addChild(item);
            crnt_gridItem_selected->addChild(item_copy);
            if(wearer_headImg != NULL && wearer_headImg_copy != NULL){
                crnt_gridItem->addChild(wearer_headImg);
                crnt_gridItem_selected->addChild(wearer_headImg_copy);
            }
//        }
        
        CCSprite *selected_frame = CCSprite::create("BagScene/bag_cell_selected.png");
        selected_frame->setPosition(ccp(crnt_gridItem_selected->getContentSize().width/2,
                                        crnt_gridItem_selected->getContentSize().height/2));
        
        crnt_gridItem_selected->addChild(selected_frame);
        
        CCMenuItemSprite *crntItem = CCMenuItemSprite::create(crnt_gridItem, crnt_gridItem_selected,
                                                              this->selectorTarget, this->selector);
        
        crntItem->setPosition(ccp(stage_begainXPos+(item_width+gap_Xwidth)*(i%4),
                                  layerContentHeight-44-(item_height+gap_Ywidth)*(i/4)));
        
        // since every stage is calling the same callback funtion,
        // so we need to set a tag, use getTag() to judge which item you chose
        crntItem->setTag( crntEqui->uniqueId /*i*/);
        
        gridArray->addObject(crntItem);
        //stageLayer->addChild(crntStage, 2, STAGE_BEGAIN_TAG+i);
        
        ++i;
    } // CCDICT_FOREACH  END
    ScrollMenu *gridMenu = ScrollMenu::createWithArray(gridArray);
    gridMenu->setPosition(CCPointZero);
    CCPoint scrollViewWorldPos = scrollView->getParent()->convertToWorldSpace(scrollView->getPosition());
    CCLog("ScrollView's world position: x: %f, y:%f", scrollViewWorldPos.x, scrollViewWorldPos.y);
    gridMenu->setTouchableViewSize(CCRectMake(scrollViewWorldPos.x, scrollViewWorldPos.y, 335, 335));
    
    // ScrollMenu的瑕疵. 当强制设置某MenuItem为selected()时, ScrollMenu无法确认该MenuItem为选中状态而导致第一次点击
    // selected MenuItem时, ScrollMenu会再次设置其为selected() 而导致视觉上为触摸失效。
    // 需手动设置ScrollMenu的last_selectedItemTag(上一次选中的MenuItem Tag)
    if(selectedTag >= 0){
        ((CCMenuItem *) gridMenu->getChildByTag(selectedTag))->selected();
        gridMenu->last_selectedItemTag = selectedTag;
        
    }
    
    contentLayer->removeAllChildrenWithCleanup(true);
    contentLayer->addChild(gridMenu);
    if(isReposition){
        contentLayer->setPosition(CCPointMake(0, -(layerContentHeight-335)));
    }
    contentLayer->setContentSize(CCSizeMake(winSize.width, layerContentHeight));
    
    
    //scrollView->setContainer(contentLayer);
    
}

CCNode* BagView::generateBagItem(){
    return NULL;
}


void BagView::tab1SelectedCallback(){

}
void BagView::tab2SelectedCallback(){

}
void BagView::tab3SelectedCallback(){

}

void BagView::chbxShowAvailbleCallback(CCObject *pSender){

}
void BagView::chbxUnknownCallback(CCObject *pSender){

}


SEL_MenuHandler BagView::onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char * pSelectorName){
    
    CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "tab1SelectedCallback", BagView::tab1SelectedCallback);
    CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "tab2SelectedCallback", BagView::tab2SelectedCallback);
    CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "tab3SelectedCallback", BagView::tab3SelectedCallback);
    CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "chbxShowAvailbleCallback", BagView::chbxShowAvailbleCallback);
    CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "chbxUnknownCallback", BagView::chbxUnknownCallback);
    return NULL;
}
SEL_CCControlHandler BagView::onResolveCCBCCControlSelector(CCObject * pTarget, const char * pSelectorName){
    return NULL;
}

bool BagView::onAssignCCBMemberVariable(CCObject * pTarget, const char * pMemberVariableName, CCNode * pNode){
    
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_tab1_nor", CCLabelTTF *, this->tab1WordNormal);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_tab1_sle", CCLabelTTF *, this->tab1WordSelected);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_tab2_nor", CCLabelTTF *, this->tab2WordNormal);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_tab2_sle", CCLabelTTF *, this->tab2WordSelected);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_tab3_nor", CCLabelTTF *, this->tab3WordNormal);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_tab3_sle", CCLabelTTF *, this->tab3WordSelected);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "menu_checkboxes", CCMenu *, this->checkBoxMenu);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "tab_menu", CCMenu *, this->tabsMenu);
    //CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "bagslots_scrollview", CCScrollView *, this->scrollView);
    return true;
}


void BagView::scrollViewDidScroll(CCScrollView* view){

}
void BagView::scrollViewDidZoom(CCScrollView* view){

}

void BagView::registerWithTouchDispatcher(void){

    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -20, false);

}
bool BagView::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){
    CCPoint touchPoint = this->convertTouchToNodeSpace(pTouch);
    
    return true;
}
void BagView::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){

}
void BagView::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){

}
void BagView::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent){

}

CCNode* BagViewCreator::createBagView(){
    
    cocos2d::extension::CCNodeLoaderLibrary * ccNodeLoaderLibrary = cocos2d::extension::CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
    ccNodeLoaderLibrary->registerCCNodeLoader("BagView", BagViewLoader::loader());
    /* Create an autorelease CCBReader. */
    cocos2d::extension::CCBReader * ccbReader = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary);
    /* Read a ccbi file. */
    CCNode * node = ccbReader->readNodeGraphFromFile("ccbi/bag_view.ccbi", this);
    
    ccbReader->release();
    return node;
}




```


代码里垃圾比较多,而且后来一阵还改成cocosbuilder读取了, scrollview中的背包内容确实是手动敲出来的。refreshBagView就是核心代码了,主要问题在于

0 背包格子坐标,用小学数学知识解决。
1 scrollview中内嵌CCMenu的话会导致用户touchbegan如果在menuitem上,那么之后就不可以再滑动了(被吃了)。
2 内嵌CCMenu会导致超出scrollview的可视范围仍可点击。
3 刷新背包操作 滚动层能保持之前浏览的位置。

1、2用一个重写了CCMenu的ScrollMenu来实现。若需要的话我再跟帖回吧。
3还是用小学数学知识解决。


贴一张效果图,等我给服务起了去。。。

why are you so diao。。。

嗯 谢谢 看看 还有cocostudio Image_windows是图片控件 button_all_down是Image_windows的子 也是图片控件怎么获得button_all_down的坐标 getPosition()不对啊 Panel_407是绝对布局