基于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,整个大 ...
随机推荐
- CXF WebService 资料收集
Java Web 服务专题 :http://www.ibm.com/developerworks/cn/java/j-ws/ APACHE CXF官网 :http://cxf.apache.org/d ...
- jquery 插件之 点赞“+1” 特效
一般用户点个赞后,都会有个 +1 的特效飘过,用户已经点过赞了,会有“已点过赞”的特效提示 在这里,我们写了一个点赞的插件 //扩展对象点赞插件.点赞特效 //用法:jQuery('.praisebt ...
- 缓存插件 EHCache 页面缓存CachingFilter
Ehcache基本用法 CacheManager cacheManager = CacheManager.create(); // 或者 cacheManager = CacheManager.get ...
- openSSL命令、PKI、CA、SSL证书原理
相关学习资料 http://baike.baidu.com/view/7615.htm?fr=aladdin http://www.ibm.com/developerworks/cn/security ...
- view的绘制原理
转:http://blog.csdn.net/berber78/article/details/42069301 自定义UI控件,需继承 View类或View的子类,并重载View类中的一些方法,不必 ...
- hihocoder 1169 猜数字
传送门 时间限制:10000ms 单点时限:5000ms 内存限制:256MB 描述 你正在和小冰玩一个猜数字的游戏.小冰首先生成一个长为N的整数序列A1, A2, …, AN.在每一轮游戏中,小冰会 ...
- 通过HTTP协议实现多线程下载
1. 基本原理,每条线程从文件不同的位置开始下载,最后合并出完整的数据. 2. 使用多线程下载的好处 下载速度快.为什么呢?很好理解,以往我是一条线程在服务器上下载.也就是说,对应在服务器上, ...
- LocalDB简介和在VS2012及以上版本的使用
http://www.cnblogs.com/fzrain/p/3812364.html?utm_source=tuicool LocalDB简介和在VS2012及以上版本的使用 之前一不小心把自 ...
- 一个共通的viewModel搞定所有的编辑页面-经典ERP录入页面(easyui + knockoutjs + mvc4.0)
http://www.cnblogs.com/xqin/archive/2013/06/06/3120887.html 前言 我写代码喜欢提取一些共通的东西出来,之前的一篇博客中说了如何用一个共通的v ...
- Iterator&Vector应用实例
public class test1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-gene ...