cocosStudio中使用PageView,ListView和ScrollView

晚上吃东西好像吃坏肚子了,。但是技术还要继续研究。最近工作中要使用CocosStudio做界面,好吧,不管对他有什么偏见,学习一下吧。这里主要记录一下三个控件的使用和说明。就是ScrollView,ListView和PageView。

首先大致的介绍一下这三个控件吧,scrollView顾名思义,滑动容器可以上下滑动,也可以左右滑动。PageView可以这么理解,它就是scrollView的超级版,因为它是整页滑动。listView是列表容器,它相对与其它两个控件来讲,它不不能添加精灵、粒子、声音、地图和节点对象。

在cocosStudio(使用版本2.0.6)中创建,如下图,可以看到三种容器分别是滑动容器,列表容器和翻页容器

创建地方式就是直接拖到场景中,然后在其中加入对应地组件,这是在一些确定地情况下使用的。但是,通常的情况是我们程序需要使用代码来根据不同的数据动态的加入各种的界面组件。下面就使用程序创建加入组件,这个前提依然是使用cocosStudio创建一个空的容器,然后手动加入容器中的内容。

ScrollView:

cocosStudio中创建一个场景,场景中放入一个空的scrollView,下面代码加入其中的组件

void HelloWorld::initScrollView() {
    auto layer = CSLoader::getInstance()->createNode("ScrollViewScene.csb");
    this->addChild(layer, 1);

    auto scrollView = static_cast<ui::ScrollView *>(Helper::seekWidgetByName(static_cast<Widget *>(layer), "ScrollView_1"));

    for (auto i = 0; i< 4; i++) {
        auto btn = Button::create("bunny.png"); //这里我是直接加入了一个按钮,还可以加入其它的东西,甚至是一个子界面
        btn->setTouchEnabled(true);
        btn->setTitleText("scrollViewBtn");
        btn->setTitleFontSize(30);
        scrollView->addChild(btn);
        btn->addClickEventListener(CC_CALLBACK_1(HelloWorld::clickBtnCallback, this));
        btn->setPosition(Vec2(300, 50 + i * 100)); //自己设置对应的位置
    }

    scrollView->scrollToBottom(0.1f, false);
//    scrollView->setDirection(cocos2d::ui::ScrollView::Direction::VERTICAL);
//    scrollView->jumpToBottom();
    scrollView->addEventListener(CC_CALLBACK_2(HelloWorld::scrollViewMoveCallback, this));
}

void HelloWorld::scrollViewMoveCallback(cocos2d::Ref *pSender, cocos2d::ui::ScrollView::EventType eventType) {
    switch (eventType) {
        case ui::ScrollView::EventType::SCROLLING:
            CCLOG("scrolling");
            break;
        case ui::ScrollView::EventType::SCROLL_TO_BOTTOM:
            CCLOG("scrolling bottom");
            break;
        case ui::ScrollView::EventType::SCROLL_TO_TOP:
            CCLOG("scrolling top");
            break;
        default:
            break;
    }
}

PageView:

cocosStudio中创建一个场景,场景中放入一个空的pageView,加入其中的组件

void HelloWorld::initPageView() {
    auto layer = CSLoader::getInstance()->createNode("PageViewScene.csb");
    this->addChild(layer, 1);
    auto winSize = Director::getInstance()->getWinSize();
    auto pageView = static_cast<ui::PageView *>(Helper::seekWidgetByName(static_cast<Widget *>(layer), "PageView_1"));
    pageView->setTouchEnabled(true);

    for (auto i = 0; i<5; i++) {
        auto layout = Layout::create();
        layout->setContentSize(pageView->getContentSize());
//        auto node = CSLoader::getInstance()->createNode("Stone.csb");
//        layout->addChild(node);
        auto label = Text::create();
        label->setString(std::string(__String::createWithFormat("xxx _%d", i)->getCString()));
        label->setFontSize(40);
        layout->addChild(label);
        label->setPosition(Vec2(100, 100));
        pageView->addPage(layout);

    }
}

ListView:

cocosStudio中创建一个场景,场景中放入一个空的listView,下面代码加入其中的组件

void HelloWorld::initListView() {
    auto node = CSLoader::getInstance()->createNode("MainScene.csb");
    addChild(node, 1);

    auto node1 = CSLoader::getInstance()->createNode("Stone.csb");
    //    node->addChild(node1, 1);
    //    node1->setPosition(Vec2(300, 500));

    auto layout = static_cast<Layout *>(Helper::seekWidgetByName(static_cast<Widget *>(node), "ListView_1"));
    //    layout->setPosition(Vec2(300, 300));

    layout->removeAllChildren();
    auto listView = static_cast<ListView *>(layout);
    listView->setGravity(cocos2d::ui::ListView::Gravity::CENTER_HORIZONTAL);
    listView->setItemsMargin(10.0f);
    listView->setClippingEnabled(true);

    for (auto i = 0; i<10; i++) {
        if (i == 1) {
            listView->insertCustomItem(static_cast<Widget *>(node1), i);
            continue;
        }
        if (i%2 == 0) {
            auto img = ImageView::create();
            img->loadTexture("bunny.png");
            listView->insertCustomItem(img, i);
            img->setTouchEnabled(true);
            img->addTouchEventListener(CC_CALLBACK_2(HelloWorld::clickImgCallback, this));
            img->setTag(i);
        } else {
            //            auto img = ImageView::create();
            //            img->loadTexture("stone.png");
            //            listView->insertCustomItem(img, i);
            auto btn = Button::create();
            btn->loadTextureNormal("stone.png");
            btn->setTouchEnabled(true);
            auto btnName = __String::createWithFormat("BTN_%d", i);
            btn->setTitleText(std::string(btnName->getCString()));
            btn->setTitleFontSize(20);
            btn->setTag(i);
            btn->addClickEventListener(CC_CALLBACK_1(HelloWorld::clickBtnCallback, this));
            listView->insertCustomItem(btn, i);
        }
    }
}

void HelloWorld::clickBtnCallback(cocos2d::Ref *pSender) {
    auto btn = static_cast<Button *>(pSender);
    CCLOG("click btn Tag = %d", btn->getTag());
}

void HelloWorld::clickImgCallback(cocos2d::Ref *pSender, Widget::TouchEventType event) {
    if (event != Widget::TouchEventType::ENDED) {
        return;
    }
    auto img = static_cast<ImageView *>(pSender);
    CCLOG("click img Tag = %d", img->getTag());
}

这里只是一些简单的例子,如果想要研究更加仔细的东西,看源码。程序员必备的技能!

时间: 2024-10-23 00:00:18

cocosStudio中使用PageView,ListView和ScrollView的相关文章

Cocos2d-JS中使用CocosStudio资源——ListView和ScrollView

在本篇博客中,我们将简要分析一下ListView和ScrollView之间的关系,如何正确使用两个控件进行设计,目前CocosStudio对两个控件的支持状况等. 一.ListView和ScrollView的一些思考 1. 两者联系: 首先,我们要知道ListView是继承自ScrollView的,也就是说,ListView在ScrollView的基础上,对一些细节功能进行了细化.ScrollView有的方法,ListView都有,而ListView有的,ScrollView未必有. 官方的JS

冲突--ListView与ScrollView冲突的4种解决方案

众所周知ListView与ScrollView都具有滚动能力,对于这样的View控件,当ScrollView与ListView相互嵌套会成为一种问题: 问题一:ScrollView与ListView嵌套导致ListView显示不全面 问题二:ScrollView不能正常滑动 解决方式一: ScrollView+LinearLayout+ListView可以换成ScrollView+LinearLayout+LinearLayout,对于开发中,ScrollView所能滚动的样式形式各异,另外的话

ListView ViewPager ScrollView 修改边界色

如果觉得android中默认的listview 滑动到上面或者底部的阴影色不好看,可以这么定义 先看效果图 public class ListView extends android.widget.ListView { private OnScrollListener mLegacyOnScrollListener; private final MulticastOnScrollListener mMulticastOnScrollListener = new MulticastOnScroll

使用LinearLayout实现ListView,解决ListView和ScrollView滚动冲突

在项目中,我们常常会遇到一个ScrollView里面会嵌套ListView的情况,但往往你会发现,ListView和ScrollView的滚动时间会有冲突问题,造成ListView不能完全显示.虽然网上有给出解决方案,但事实上并不好用,并不完美. public void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter ListAdapter listAdapter = listView.g

详解嵌套ListView、ScrollView布局显示不全的问题

在项目开发中,可能经常遇到嵌套ListView.ScrollView的问题,就是重写onMeasure方法.解决如下 public class ExpandListView extends ListView { public ExpandListView(Context context) { super(context); } public ExpandListView(Context context, AttributeSet attrs) { super(context, attrs); }

ListView与ScrollView冲突的4种接近方案

众所周知ListView与ScrollView都具有滚动能力,对于这样的View控件,当ScrollView与ListView相互嵌套会成为一种问题: 问题一:ScrollView与ListView嵌套导致ListView显示不全面 问题二:ScrollView不能正常滑动 解决方式一: ScrollView+LinearLayout+ListView可以换成ScrollView+LinearLayout+LinearLayout,对于开发中,ScrollView所能滚动的样式形式各异,另外的话

ListView和ScrollView冲突

当ListView放在ScrollView中的时候,无论你设置高度为 match_parent(填充父窗体)和wrap_content(包裹内容)都只显示一行,这是你把ListView放在LinearLayout 中,再给listview一个具体的高度,就可以显示多行了. 如: <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent"> <L

ListView与ScrollView冲突的4种解决方案

问题解决方案1.手动设置ListView高度    经过测试发现,在xml中直接指定ListView的高度,是可以解决这个问题的,但是ListView中的数据是可变的,实际高度还需要实际测量.于是手动代码设置ListView高度的方法就诞生了. /** * 动态设置ListView的高度 * @param listView */ public static void setListViewHeightBasedOnChildren(ListView listView) { if(listView

android 开发-ListView与ScrollView事件冲突处理(事件分发机制处理)

ListView和ScrollView都存在滚动的效果,所以一般不建议listView和scrollView进行嵌套使用,但有些需求则需要用到两者嵌套.在android的学习中学了一种事件分发处理机制. 如果listView显示在UI上部,而如imageView等显示在UI下部. 首先为listView注册一个滑动监听事件 通过为listView设置固定高度,并注册滑动监听事件.在划动监听事件中,记录用户是否滑动至listView数据底部. 通过activity的dispatchTouchEve