cocos2dx-CCTableView或CCScrollView之滑动翻页实现

19 篇文章 0 订阅
12 篇文章 0 订阅

scrollview //CScrollViewTest.cpp

//CScrollViewTest.h


//CCLayer *m_pLayer;

//CCScrollView *m_pScrollView;

//CCPoint m_touchPoint;

//bool m_isMoving;

//void adjustScrollView();

CScrollViewTest::CScrollViewTest()
:m_isMoving(false)
{
	  m_pLayer= CCLayer::create();
	  char helpstr[30] = {0};
	  for (int i = 1; i <= 4; ++ i)//页背景
	  {
		   memset(helpstr, 0, sizeof(helpstr));
		   sprintf(helpstr,"bg_%02d.png",i);
		   CCSprite *pSprite = CCSprite::create(helpstr);
		   pSprite->setPosition(ccp(visibleSize.width * (i-0.5f), visibleSize.height / 2));
		   m_pLayer->addChild(pSprite);
	  }
	  m_pScrollView = CCScrollView::create(CCSizeMake(1024, 640), m_pLayer);
	  m_pScrollView->setPosition(CCPointZero);
	  m_pScrollView->setContentOffset(CCPointZero);
	  m_pScrollView->setDelegate(this);
	  m_pScrollView->setDirection(kCCScrollViewDirectionHorizontal);
	  m_pLayer->setContentSize(CCSizeMake(1024*2, 640));
	 
	  this->addChild(m_pScrollView);
}

bool CScrollViewTest::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
 m_touchPoint = pTouch->getLocation();
 return true;
}

void CScrollViewTest::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
 if (!m_isMoving) {
  m_isMoving = true;
 }
}

void CScrollViewTest::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
 if(m_isMoving){
  adjustScrollView();
  return;}
}

void CScrollViewTest::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
   if(m_isMoving) adjustScrollView();
}

void CScrollViewTest::adjustScrollView()
{
	 // 关闭CCScrollView中的自调整
	     m_pScrollView->unscheduleAllSelectors();
	
	  INT32 i32pageNum =  4;//翻页数
	
	  int x = m_pScrollView->getContentOffset().x;
	
	  BOOL bOffline = FALSE;
	  if( x <= (-1)*( (i32pageNum-1)*600+300) )
	   bOffline = TRUE;
	
	
	 int offset = (int) x % (int)600;
	 // 调整位置
	 CCPoint adjustPos;
	 // 调整动画时间
	 float adjustAnimDelay;
	
	 if (offset < -600*0.5 && !bOffline ) {
	  // 计算下一页位置,时间
	  adjustPos = ccpSub(m_pScrollView->getContentOffset(), ccp(600 + offset, 0));
	  adjustAnimDelay = (float) (600 + offset) / 800;
	 }
	 else {
	  // 计算当前页位置,时间
	  adjustPos = ccpSub(m_pScrollView->getContentOffset(), ccp(offset, 0));
	  // 这里要取绝对值,否则在第一页往左翻动的时,保证adjustAnimDelay为正数
	  adjustAnimDelay = (float) abs(offset) / 800;
	 }
	
	 // 调整位置
	 m_pScrollView->setContentOffsetInDuration(adjustPos, adjustAnimDelay);
}

tableview // CTableViewTest.cpp  //CCPoint m_TouchBeginPos;

CTableViewTest::CTableViewTest(void)
{

	this->setTouchEnabled(TRUE);
	m_pTableView = CCTableView::create(this, CCSizeMake(1024, 640));
	m_pTableView->setDirection(kCCScrollViewDirectionHorizontal);
	m_pTableView->setPosition(ccp(CCPointZero));
	m_pTableView->setDelegate(this);
	this->addChild(m_pTableView);
	m_pTableView->reloadData();
}

bool CTableViewTest::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
	m_TouchBeginPos = pTouch->getLocation();
	return true;
}

void CTableViewTest::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
	CCPoint EndPos =  pTouch->getLocation();

	if( EndPos.x == m_TouchBeginPos.x )
		return;

	m_pTableView->unscheduleAllSelectors();

	INT32 i32PagNum =  2;

	int x = m_pTableView->getContentOffset().x;

	bool bOffline = false;
	if( x <= (-1)*( (i32PagNum-1)*600+300) )
		bOffline = TRUE;

	int offset = (int) x % 600;

	// 调整位置   
	CCPoint adjustPos;
	// 调整动画时间   
	float adjustAnimDelay;

	if (offset <= -300 && !bOffline ) { 
		// 计算下一页位置,时间
		adjustPos = ccpSub(m_pTableView->getContentOffset(), ccp(600 + offset, 0));  
		adjustAnimDelay = (float) (600 + offset) / 1000;
	}  
	else {  
		// 计算当前页位置,时间   
		adjustPos = ccpSub(m_pTableView->getContentOffset(), ccp(offset, 0));  
		// 这里要取绝对值,否则在第一页往左翻动的时,保证adjustAnimDelay为正数   
		adjustAnimDelay = (float) abs(offset) / 1000; 
	}   
	// 调整位置
	m_pTableView->setContentOffsetInDuration(adjustPos, adjustAnimDelay);  

}



 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值