Cocos 2.2.3 ScrollView浅谈

先感性认识一下ScrollView:

1、上图中ScrollView就是我们要创建的滚动视图,你可以给它指定大小,也可以按默认的200*200,ScrollView设定的区域,就是你内容可以显示的区域,超出区域部分将被隐藏

2、m_pContainer为具体显示项的容器,具体显示项就是紫色矩形,只有m_pContainer在ScrollView中的部分才可以被显示出来,m_pContainer是可以被拖动的

3、m_pContainer默认为CCLayer,当然你也可以自己创建,该容器以及容器下的子物体都是以左下角为锚点的

4、该控件在使用过程中是可以用委托来监控ScrollView的滚动和缩放过程的,具体见.h文件


使用小例:

#include "cocos-ext.h"
USING_NS_CC_EXT;

CCScrollView *scrollView = CCScrollView::create();
scrollView->setPosition(ccp(240, 0));	//此处的位置为ScrollView左下角的位置
scrollView->setContentSize(CCSize(200, 600));	//设置容器的位置
scrollView->setDirection(kCCScrollViewDirectionVertical);	//默认为双向都可滑动,此处改为只有垂直方向滑动
scrollView->setBounceable(true);	//可选项,根据需求决定超过边界后是否要开启弹动
scrollView->setContentOffset(ccp(0, -400));	//设置m_pContainer的初始偏移,因为容器左下角和ScrollView左下角是重合的,所以减多少,代表下移多少,横向一样
this->addChild(scrollView);

for(int i = 0; i < 10; i++)
{
	CCSprite * p = CCSprite::create("CloseNormal.png");
	p->setPositionY(i * 50);	//容器项的位置需要手动设定
	scrollView->addChild(p);	//此处默认为给m_pContainer添加容器项
}	



学习思路:

1.先打开TestCpp——TableViewTest,看下效果,虽然是TableView,但最终效果差不多

2.阅读CCScrollView.h——这一段大体浏览就好了

3.重点阅读CCScrollView.cpp文件——因为这个组件肯定是要根据需求进行定制的,所以要重点阅读,一个函数一个函数的看,后面源码中有贴我理解后的注释,希望能帮助同样有困惑的你

ps:虽然是2.2.3的,但我看了3.3的相关内容,相差不大,可以对照来看,同时当你遇到一些莫名其妙的语句的时候,相信自己,因为里面确实有一些小问题。

         以函数为单位来学习。


/****************************************************************************
 Copyright (c) 2012 cocos2d-x.org
 Copyright (c) 2010 Sangwoo Im
 
 http://www.cocos2d-x.org
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:
 
 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.
 
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 ****************************************************************************/

#include "CCScrollView.h"

NS_CC_EXT_BEGIN

#define SCROLL_DEACCEL_RATE  0.95f
#define SCROLL_DEACCEL_DIST  1.0f
#define BOUNCE_DURATION      0.15f
#define INSET_RATIO          0.2f
#define MOVE_INCH            7.0f/160.0f

static float convertDistanceFromPointToInch(float pointDis)
{
    float factor = ( CCEGLView::sharedOpenGLView()->getScaleX() + CCEGLView::sharedOpenGLView()->getScaleY() ) / 2;
    return pointDis * factor / CCDevice::getDPI();
}


CCScrollView::CCScrollView()
: m_fZoomScale(0.0f)
, m_fMinZoomScale(0.0f)
, m_fMaxZoomScale(0.0f)
, m_pDelegate(NULL)
, m_eDirection(kCCScrollViewDirectionBoth)
, m_bDragging(false)
, m_pContainer(NULL)
, m_bTouchMoved(false)
, m_bBounceable(false)
, m_bClippingToBounds(false)
, m_fTouchLength(0.0f)
, m_pTouches(NULL)
, m_fMinScale(0.0f)
, m_fMaxScale(0.0f)
{

}

CCScrollView::~CCScrollView()
{
    CC_SAFE_RELEASE(m_pTouches);
    this->unregisterScriptHandler(kScrollViewScroll);
    this->unregisterScriptHandler(kScrollViewZoom);
}

CCScrollView* CCScrollView::create(CCSize size, CCNode* container/* = NULL*/)
{
    CCScrollView* pRet = new CCScrollView();
    if (pRet && pRet->initWithViewSize(size, container))
    {
        pRet->autorelease();
    }
    else
    {
        CC_SAFE_DELETE(pRet);
    }
    return pRet;
}

CCScrollView* CCScrollView::create()
{
    CCScrollView* pRet = new CCScrollView();
    if (pRet && pRet->init())
    {
        pRet->autorelease();
    }
    else
    {
        CC_SAFE_DELETE(pRet);
    }
    return pRet;
}


bool CCScrollView::initWithViewSize(CCSize size, CCNode *container/* = NULL*/)
{
    if (CCLayer::init())
    {
        m_pContainer = container;
        
        if (!this->m_pContainer)
        {
            m_pContainer = CCLayer::create();
            this->m_pContainer->ignoreAnchorPointForPosition(false);
            this->m_pContainer->setAnchorPoint(ccp(0.0f, 0.0f));
        }

        this->setViewSize(size);

        setTouchEnabled(true);
        m_pTouches = new CCArray();
        m_pDelegate = NULL;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值