基于cocoStudio的UIListView的可以左右滑动翻页的ListView
//WidgetSlideListView.h
class WidgetEaseInListView : public cocos2d::gui::UIListView
{
public:
static WidgetEaseInListView* create(cocos2d::gui::UIListView* pAnthor=NULL);
void doEaseIn(bool bRight2Left=true); protected:
virtual void copySpecialProperties(cocos2d::gui::Widget* model); protected:
virtual void onEaseInOver();
virtual void startEaseIn(bool bRight2Left);
virtual void tick(float delta); protected:
bool m_bRight2Left;
}; class SlideListViewDataSource
{
public:
virtual size_t getTotalItemNum() = 0;
virtual size_t getEveryPageItemNum() = 0;
virtual cocos2d::gui::UIWidget* getWidgetAt(size_t nIdx) = 0;
virtual void onPageTurnOver(size_t nCurrentPage){}
}; class WidgetSlideListView : public WidgetEaseInListView
{
enum SlideDir
{
eSlideDir_None = 0,
eSlideDir_Horizon_Left,
eSlideDir_Horizon_Right,
eSlideDir_Virtical
}; protected:
WidgetSlideListView();
virtual ~WidgetSlideListView(); public:
static WidgetSlideListView* create(SlideListViewDataSource* pDelegate,cocos2d::gui::UIListView* pAnthor=NULL); public:
void setDelegate(SlideListViewDataSource* pDelegate){ m_pDelegate = pDelegate; }
void reloadData();
size_t getCurrentPage()const{ return m_nCurrentPage; }
void turnToPage(unsigned int nPage); protected:
virtual bool init();
virtual void handleMoveLogic(const cocos2d::CCPoint &touchPoint);
virtual void handleReleaseLogic(const cocos2d::CCPoint &touchPoint);
void scheduleTurnPage(float t); protected:
SlideListViewDataSource* m_pDelegate;
size_t m_nCurrentPage;
SlideDir m_eSlideDir;
cocos2d::CCPoint m_BackPos;
};
//WidgetSlideListView.cpp
#include "../include/WidgetSlideListView.h" USING_NS_CC;
USING_NS_CC_EXT;
using namespace cocos2d::gui; WidgetEaseInListView* WidgetEaseInListView::create(UIListView* pAnthor/*=NULL*/)
{
WidgetEaseInListView* pRet = new WidgetEaseInListView();
if (pRet && pRet->init())
{
pRet->autorelease();
if (pAnthor)
{
pRet->copyProperties(pAnthor);
} return pRet;
}
else
{
delete pRet;
pRet = NULL;
return NULL;
}
} void WidgetEaseInListView::copySpecialProperties(cocos2d::gui::Widget* model)
{
UIListView::copySpecialProperties(model); setDirection(SCROLLVIEW_DIR_VERTICAL);
setBounceEnabled(true);
setTouchEnabled(true);
} void WidgetEaseInListView::tick(float delta)
{
startEaseIn(m_bRight2Left);
} void WidgetEaseInListView::doEaseIn(bool bRight2Left)
{
stopAllActions();
for (unsigned int i=0; i<getItems()->count(); i++)
{
UIWidget* pWidget = getItem(i);
pWidget->setVisible(false);
}
m_bRight2Left = bRight2Left;
scheduleOnce(schedule_selector(WidgetEaseInListView::tick),0);
} void WidgetEaseInListView::startEaseIn(bool bRight2Left)
{
setTouchEnabled(false); static const float fDelay = 0.1f;
static const float fMoveTime = 0.4f; CCArray* pActSeq = CCArray::create(); float fVisibleHeight = 0.0f;
float fTotalHeight = getSize().height;
CCArray* pArr = getItems();
int nSlidCount =0;
for (unsigned int i=0; i<pArr->count(); i++)
{
UIWidget* pWidget = getItem(i);
pWidget->setVisible(true); fVisibleHeight+=pWidget->getSize().height;
if (fVisibleHeight<fTotalHeight+pWidget->getSize().height)
{
float fOffset = (bRight2Left?1:-1)*pWidget->getContentSize().width;
CCPoint startPos = ccpAdd(pWidget->getPosition(),ccp(fOffset,0));
//CCPoint startPos = ccp(pWidget->getContentSize().width/2+fOffset,pWidget->getPosition().y);
pWidget->setPosition(startPos);
CCSequence* pAct = CCSequence::createWithTwoActions(CCDelayTime::create(fDelay*i),CCEaseBackOut::create(CCMoveBy::create(fMoveTime,ccp(-fOffset,0))));
pActSeq->addObject(CCTargetedAction::create(pWidget,pAct) ); nSlidCount++;
}
}
CCSequence* pAct = CCSequence::createWithTwoActions(CCDelayTime::create(fDelay*nSlidCount),CCCallFunc::create(this,callfunc_selector(WidgetEaseInListView::onEaseInOver)));
pActSeq->addObject(pAct); runAction(CCSpawn::create(pActSeq));
} void WidgetEaseInListView::onEaseInOver()
{
setTouchEnabled(true);
} WidgetSlideListView::WidgetSlideListView()
:m_pDelegate(NULL)
,m_nCurrentPage(0)
,m_eSlideDir(eSlideDir_None)
{ } WidgetSlideListView::~WidgetSlideListView()
{ } WidgetSlideListView* WidgetSlideListView::create(SlideListViewDataSource* pDelegate,UIListView* pAnthor/*=NULL*/)
{
WidgetSlideListView* pRet = new WidgetSlideListView();
if (pRet && pRet->init())
{
pRet->autorelease();
pRet->setDelegate(pDelegate);
if (pAnthor)
{
pRet->copyProperties(pAnthor);
} return pRet;
}
else
{
delete pRet;
pRet = NULL;
return NULL;
} } bool WidgetSlideListView::init()
{
if (UIListView::init())
{
setDirection(SCROLLVIEW_DIR_VERTICAL);
setBounceEnabled(true);
setTouchEnabled(true);
return true;
}
return false;
} void WidgetSlideListView::reloadData()
{
assert(m_pDelegate);
assert(m_pDelegate->getEveryPageItemNum()>0);
unsigned int nTotalPage = m_pDelegate->getTotalItemNum()/m_pDelegate->getEveryPageItemNum();
nTotalPage+= m_pDelegate->getTotalItemNum()%m_pDelegate->getEveryPageItemNum()>0 ? 1 : 0; assert(m_nCurrentPage>=0); removeAllItems();
if (m_pDelegate->getTotalItemNum()>0)
{
assert(m_nCurrentPage<nTotalPage); for (size_t i=0; i<m_pDelegate->getEveryPageItemNum(); i++)
{
if (m_pDelegate->getTotalItemNum()<(i+1)+m_nCurrentPage*m_pDelegate->getEveryPageItemNum())
{
break;
} UIWidget* pChild = m_pDelegate->getWidgetAt(m_nCurrentPage*m_pDelegate->getEveryPageItemNum()+i); if (!pChild)
{
break;
} pushBackCustomItem(pChild);
}
}
jumpToTop();
} void WidgetSlideListView::handleMoveLogic( const CCPoint &touchPoint )
{
_touchMovedPoint = convertToNodeSpace(touchPoint);
CCPoint delta = _touchMovedPoint - _touchBeganPoint; if (eSlideDir_None==m_eSlideDir)
{
m_eSlideDir = fabs(delta.x)>fabs(delta.y) ? eSlideDir_Horizon_Left : eSlideDir_Virtical;
m_BackPos = _innerContainer->getPosition();
} if (eSlideDir_Virtical==m_eSlideDir)
{
UIListView::handleMoveLogic(touchPoint);
}
else if (eSlideDir_None!=m_eSlideDir)
{
if (isTouchEnabled())
{
CCPoint pt = ccp(m_BackPos.x+delta.x,m_BackPos.y);
_innerContainer->setPosition(pt);
}
}
} void WidgetSlideListView::handleReleaseLogic( const CCPoint &touchPoint )
{
if (eSlideDir_Virtical==m_eSlideDir)
{
UIListView::handleReleaseLogic(touchPoint);
m_eSlideDir = eSlideDir_None;
}
else if (eSlideDir_None!=m_eSlideDir)
{
if (isTouchEnabled())
{
CCPoint delta = _touchMovedPoint - _touchBeganPoint; static const float fDelatPosX = 30;
if (delta.x<-fDelatPosX && m_pDelegate->getTotalItemNum()>(m_nCurrentPage+1)*m_pDelegate->getEveryPageItemNum())
{
m_eSlideDir = eSlideDir_Horizon_Left;
scheduleOnce( schedule_selector(WidgetSlideListView::scheduleTurnPage),0);
}
else if (delta.x>fDelatPosX && m_nCurrentPage>0)
{
m_eSlideDir = eSlideDir_Horizon_Right;
scheduleOnce( schedule_selector(WidgetSlideListView::scheduleTurnPage),0);
}
else
{
m_eSlideDir = eSlideDir_None;
_innerContainer->setPosition(m_BackPos);
}
}
} } void WidgetSlideListView::turnToPage(unsigned int nPage)
{
bool bRight2Left = m_nCurrentPage<=nPage;
m_nCurrentPage=nPage;
reloadData();
doEaseIn(bRight2Left);
m_pDelegate->onPageTurnOver(m_nCurrentPage);
} void WidgetSlideListView::scheduleTurnPage(float t)
{
if (eSlideDir_Horizon_Left==m_eSlideDir)
{
turnToPage(m_nCurrentPage+1);
}
else if (eSlideDir_Horizon_Right==m_eSlideDir)
{
turnToPage(m_nCurrentPage-1);
} m_eSlideDir = eSlideDir_None;
}
基于cocoStudio的UIListView的可以左右滑动翻页的ListView的更多相关文章
- 基于HTML5手机上下滑动翻页特效
基于HTML5手机上下滑动翻页特效.这是一款手机移动端触屏滑动翻页代码下载.效果图如下: 在线预览 源码下载 实现的代码. html代码: <section class="u-al ...
- 基于vue实现上下滑动翻页效果
18年年底的时候,一直在做年度报告的H5页面,因为项目需要,需要实现上下滑动翻页,并且上滑的页面比正常页面的比例要缩小一定比例. 效果类似于http://www.17sucai.com/pins/de ...
- 开源 侧滑 和 Tab滑动翻页 控件
侧滑 https://github.com/jfeinstein10/SlidingMenu Tab滑动翻页 https://github.com/astuetz/PagerSlidingTabStr ...
- 桌面浏览器实现滑动翻页效果(Swiper)
还是那个号称很炫的B/S展示软件,在液晶屏上展示需要有滑动翻页的效果(在同一页面滑动切换内容,不是切换页面),最后确定使用功能很强大的Swiper类库. 具体优点可参考:http://www.chin ...
- 【解决ViewPager在大屏上滑动不流畅】 设置ViewPager滑动翻页距离
在项目中做了一个ViewPager+Fragment滑动翻页的效果,在模拟器和小米手机上测试也比较正常.但是换到4.7以上屏幕测试的时候发现老是滑动失效. 因为系统默认的滑动策略是当用户滑动超过半屏之 ...
- Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换)
Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换) Android中dp和px之间进行转换 在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip).一般情 ...
- ViewPager实现滑动翻页效果
实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下: import android.content.Context; import andr ...
- cocos2d-x滑动翻页,多出一点偏移量。
cocos2d-x 2.2.3版本. 控件:ccscrollView 实现滑动翻页:创建出来的cell横向移动时会有一个惯性滑动,导致View页面不能居中.通过延迟重新设定的方式解决.
- 微信里经常看到的滑动翻页效果,slide
上个星期我们的产品姐姐让我帮她写个微信里经常看到的滑动翻页效果,今天抽空写了3个小demo(只写了webkit需要chrome模拟手机看 开启touch事件), 故此写个随笔. 1.demo1,整个大 ...
随机推荐
- 【前端】Sublime text3 插件LiveReload 实现实时预览
1.首先要安装插件LiveReload Sublime text3. 菜单 preferences->packages control,输入install.. 回车,输入LiveReload回车 ...
- Excel 计算 tips
1. 对一列数据想看看,distinct的结果 选中数据区域(包含列名),插入pivot table 2. 想检查一个单元格的值在不在某一列中,并返回标志值 =IF (COUNTIF(B:B,A1) ...
- POJ3169 Layout
Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...
- PHP Web System Optimization(undone)
目录 . 引言 . PHP Pool . listen . Process Manage(PM) . pm.max_children . PHP DB Connection Pool(数据库连接池) ...
- HDU 2896
传送门:HDU 2896 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- poj1631Bridging signals(最长单调递增子序列 nlgn)
Bridging signals Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12251 Accepted: 6687 ...
- jquery------脚注的使用
index.jsp <script type="text/javascript" src="../js/my.js"></script> ...
- hdu 1284 钱币兑换问题(动态规划)
Ac code : 完全背包: #include<stdio.h> #include<string.h> int dp[4][40000]; int main(void) { ...
- windows2003安全加固
因为IIS的方便性和易用性,使它成为最受欢迎的Web服务器软件之一.但是,IIS的安全性却一直令人担忧.如何利用IIS建立一个安全的Web服务器,是很多人关心的话题.要创建一个安全可靠的Web服务器, ...
- 如何在eclipse中使用XYLayout布局?在此介绍如何把XYLayout导入到eclipse .
XYLayout布局是jbuilder中自带的布局,它存在于jbcl.jar包中 ,而jbcl.jar包在JBuilder安装目录的lib目录下.它是每个控件按(x,y)坐标安排位置的布局.属于Bor ...