本文的实现是參照我之前在做iOS时实现的一个能够循环的列表这里用C++重写一遍。

效果:

原文地址:http://blog.csdn.net/qqmcy/article/details/27393011

用法:能够使用创建project时的HelloWorld測试

,h文件里加入循环列表的监听回调

 void djInfiniteScroll(Ref* sender);
    

.cpp

#include "DJInfiniteScrollPicker.h"
        DJInfiniteScrollPicker* picker = DJInfiniteScrollPicker::create();
picker->setSize(Size(500, 500));
picker->imageAry = set1;
picker->setPosition(Point(10, 100));
picker->setBackGroundColorType(cocos2d::ui::LAYOUT_COLOR_SOLID);
picker->setBackGroundColor(Color3B(128, 128, 128));
picker->initInfiniteScrollView(); addChild(picker); picker->addEventDJInifiteScrollPicker(this, djInfinitescrollvieweventselector(TestScene::djInfiniteScroll));

实现类:

DJInfiniteScrollPicker.h

//
// DJInfiniteScrollPicker.h
// maptest
//
// Created by 杜甲 on 14-5-27.
//
// #ifndef __maptest__DJInfiniteScrollPicker__
#define __maptest__DJInfiniteScrollPicker__ #include "cocos2d.h"
#include "ui/CocosGUI.h"
#include "extensions/cocos-ext.h" USING_NS_CC;
typedef enum
{
sc = 0,
sc1
}ScType; typedef void (Ref::*SEL_InfiniteScrollViewEvent)(Ref*); #define djInfinitescrollvieweventselector(_SELECTOR) (SEL_InfiniteScrollViewEvent)(&_SELECTOR) class DJInfiniteScrollPicker:public ui::Layout,public extension::ScrollViewDelegate
{ public:
CREATE_FUNC(DJInfiniteScrollPicker);
virtual bool init(); static DJInfiniteScrollPicker* create(Size wsize);
virtual bool initWithSize(Size wsize); virtual void scrollViewDidScroll(extension::ScrollView* view);
/**
* @js NA
* @lua NA
*/
virtual void scrollViewDidZoom(extension::ScrollView* view); void initInfiniteScrollView(); extension::ScrollView* infiniteScrollView; std::vector<std::string> imageAry;
Size itemSize;
float alphaOfobjs; float heightOffset;
float positionRatio; void addEventDJInifiteScrollPicker(Ref* sender,SEL_InfiniteScrollViewEvent type); private:
std::vector<Sprite*> imageStore; float beforePointX;
std::string fontName;
void reloadView(float offset);
void snapToAnEmotion(); Sprite* currSprite;
bool isFirstDrag;
int currNum; Ref* _infiniteEventListener;
SEL_InfiniteScrollViewEvent _infiniteEventSelector; }; #endif /* defined(__maptest__DJInfiniteScrollPicker__) */

DJInfiniteScrollPicker.cpp

//
// DJInfiniteScrollPicker.cpp
// maptest
//
// Created by 杜甲 on 14-5-27.
//
// #include "DJInfiniteScrollPicker.h"
bool DJInfiniteScrollPicker::init()
{
bool bRet = false; do {
CC_BREAK_IF(!ui::Layout::init()); bRet = true;
} while (0);
return bRet;
} DJInfiniteScrollPicker* DJInfiniteScrollPicker::create(Size size)
{
DJInfiniteScrollPicker* pRet = new DJInfiniteScrollPicker();
if (pRet && pRet->initWithSize(size))
{
pRet->autorelease();
}
else
{
CC_SAFE_DELETE(pRet);
}
return pRet; } bool DJInfiniteScrollPicker::initWithSize(cocos2d::Size size)
{
bool bRet = false;
do {
CC_BREAK_IF(!ui::Layout::init()); bRet = true;
} while (0);
return bRet;
} void DJInfiniteScrollPicker::initInfiniteScrollView()
{
isFirstDrag = false;
fontName = "TrebuchetMS-Bold"; alphaOfobjs = 1.0f;
heightOffset = 0.0f;
positionRatio = 1.0f; beforePointX = 0.0f; infiniteScrollView = extension::ScrollView::create(getSize());
infiniteScrollView->retain();
infiniteScrollView->setPosition(Point(0, 0)); infiniteScrollView->setBounceable(false);
infiniteScrollView->setDelegate(this);
//infiniteScrollView->setContentSize(get);
addChild(infiniteScrollView); Sprite* temp = Sprite::create("res/set2/s2_1.png");
// log("anchor = %f",temp->getAnchorPoint().x);
// temp->setPosition(Point(temp->getContentSize().width / 2, temp->getContentSize().height / 2));
// // temp->setPosition(Point( itemSize.width, 0));
// infiniteScrollView->addChild(temp); if (imageAry.size() > 0) { itemSize = temp->getContentSize();
} //
if (imageAry.size() > 0) {
for (int i = 0; i < (imageAry.size() * 5); i++) {
//ui::Text* temp = ui::Text::create(StringUtils::format("%d",i % (int)imageAry.size()), fontName, 23);
Sprite* sprite = Sprite::create(imageAry.at(i % imageAry.size()));
sprite->setTag(i % imageAry.size());
sprite->setPosition(Point(i * itemSize.width + itemSize.width / 2, itemSize.height / 2));
imageStore.push_back(sprite);
infiniteScrollView->addChild(sprite);
}
} infiniteScrollView->setContentSize(Size(imageAry.size() * 5 * itemSize.width, getSize().height));
float viewMiddle = imageAry.size() * 2 * itemSize.width; infiniteScrollView->setContentOffset(Point(-viewMiddle , 0)); } void DJInfiniteScrollPicker::scrollViewDidScroll(extension::ScrollView *view)
{
float sectionSize = imageAry.size() * itemSize.width;
log("QQQQQQQQQQQQ%f,%f",infiniteScrollView->getContentOffset().x,beforePointX); if (beforePointX != infiniteScrollView->getContentOffset().x)
{ if (infiniteScrollView->getContentOffset().x < 0)
{
if (infiniteScrollView->getContentOffset().x >= (-sectionSize + sectionSize / 2))
{
view->setContentOffset(Point(-sectionSize * 2 +sectionSize / 2, 0));
}
else if (view->getContentOffset().x <= (-sectionSize * 3 - sectionSize / 2))
{
view->setContentOffset(Point(-sectionSize * 2 - sectionSize / 2, 0));
}
// if (infiniteScrollView->isDragging()) {
// log("拖拽中");
reloadView(view->getContentOffset().x - getSize().width / 2);
// } }
else
{
view->setContentOffset(Point(-sectionSize * 2 + sectionSize / 2, 0));
} //推断是否被拖拽
if (!infiniteScrollView->isDragging()) { //推断是否是首次进入,首次不拖拽
if (isFirstDrag) {
beforePointX = -currSprite->getPosition().x + getSize().width / 2;
view->setContentOffset(Point(beforePointX, 0));
//log("停止拖拽view->getContentOffset().xQQ = %f",view->getContentOffset().x);
if (_infiniteEventListener && _infiniteEventSelector) {
(_infiniteEventListener->*_infiniteEventSelector)(currSprite); } // if (_scrollViewEventListener && _scrollViewEventSelector)
// {
// (_scrollViewEventListener->*_scrollViewEventSelector)(this, SCROLLVIEW_EVENT_SCROLL_TO_TOP);
// } } isFirstDrag = true;
} }
log("view->getContentOffset().x = %f",view->getContentOffset().x); beforePointX = view->getContentOffset().x; } void DJInfiniteScrollPicker::reloadView(float offset)
{ float biggestSize = 0.0f;
Ref* biggestView;
Sprite* sprite = imageStore.at(2); for (int i = 0; i < imageStore.size(); i++)
{
Sprite* sprite = imageStore.at(i); if (-sprite->getPosition().x > (offset - itemSize.width / 2) && -sprite->getPosition().x < (offset + itemSize.width / 2)) { currSprite = sprite;
currNum = i; sprite->setScale(2); }else
{
sprite->setScale(1);
}
}
} void DJInfiniteScrollPicker::snapToAnEmotion()
{ float offset = infiniteScrollView->getContentOffset().x - getSize().width / 2; } void DJInfiniteScrollPicker::scrollViewDidZoom(extension::ScrollView *view)
{ } void DJInfiniteScrollPicker::addEventDJInifiteScrollPicker(cocos2d::Ref *sender, SEL_InfiniteScrollViewEvent type)
{
_infiniteEventListener = sender;
_infiniteEventSelector = type;
}

Cocos2d-x3.0下实现循环列表的更多相关文章

  1. iOS6.0下获取通讯录用户列表

    自iOS6.0后获取通讯录列表需要询问用户,经过用户同意后才可以获取通讯录用户列表.而且ABAddressBookRef的初始化工作也由ABAddressBookCreate函数转变为ABAddres ...

  2. 《Python基础教程》 读书笔记 第五章(下)循环语句

    5.5.1while循环 x=1 while x<=100: print x x+=1 确保用户输入了名字: name="" while not name: name=raw ...

  3. python 单向循环列表

    # -*- coding: utf-8 -*- # @author: Tele # @Time : 2019/04/23 下午 6:54 # 单向循环列表 # 单向循环列表与单向列表的不同之处在于最后 ...

  4. 微信小程序循环列表点击每一个单独添加动画

    首先,咱们看一下微信小程序动画怎么实现,我首先想到的是anime.js,但是引入之后用不了,微信小程序内的css也无法做到循环的动态,我就去找官方文档看看有没有相应的方法,哎,还真有 点击这里查看 微 ...

  5. Unity-UGUI-无限循环列表

    前言:项目准备新增一个竞技场排行榜,策划规定只显示0-400名的玩家.我一想,生成四百个游戏物体,怕不是得把手机给卡死?回想原来在GitHub上看到过一个实现思路就是无限循环列表,所以就想自己试试.公 ...

  6. js 递归下的循环

    的递归下的循环不能使用forEach  可以使用for代替 错误写法 // 获取完整名字 var getFullName = function(code, resultName) { if (code ...

  7. Debian8.3.0下安装Odoo8.0步骤

    Debian8.3.0下安装Odoo8.0的方法 假设你已经安装好了Debian 系统,使用root帐号执行如下命令 # apt-get update && apt-get upgra ...

  8. 第三方开源框架的下拉刷新列表(QQ比较常用的)。

    PullToRefreshListView是第三方开源框架下拉刷新列表,比较流行的QQ 微信等上面都在用. 下载地址(此开源框架于2013年后不再更新) 点此下载 package com.lixu.k ...

  9. 循环列表的Java实现,解决约瑟夫环问题

    import java.util.Scanner; /** * 循环列表的Java实现,解决约瑟夫环问题 * * @author LIU * */ public class LinkedList { ...

随机推荐

  1. kali的中文输入法-安装后无中文选项的解决办法

    我在我实体电脑上安装了kali 本想安装个中文输入法但是有时候输入发中根本没有选择输入法的这一项.所以导致很别扭,之前在虚机上安装过没有问题但是挪到实体机上就是没有用的也是fcitx,这一度让我这个小 ...

  2. CentOS安装SVN客户端

    1.检查系统是否已经安装如果安装就卸载 rpm -qa subversion yum remove subversion 2.安装 yum install subversion 3.建立SVN库 mk ...

  3. 09 Go 1.9 Release Notes

    Go 1.9 Release Notes Introduction to Go 1.9 Changes to the language Ports ppc64x requires POWER8 Fre ...

  4. 卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning(转)

    参考:http://blog.csdn.net/xbinworld/article/details/45619685

  5. pyhton之os.path

    目录结构 file __file__表示了当前文件的path 以相对路径运行:python 1.py 结果:1.py 以绝对路径运行:python F:\python-study\test\1.py ...

  6. CSS之外边距折叠

    外边距折叠 Collapsing margins,即外边距折叠,指的是毗邻的两个或多个外边距 (margin) 会合并成一个外边距. 其中所说的 margin 毗邻,可以归结为以下两点: 这两个或多个 ...

  7. .NetCore 使用Jenkins发布多环境下的项目并适配数据库EFCore数据库更新及替换配置文件

    说明 1.git上的配置地址可能都是本地环境,提交到git server后怎么来使用发布不同环境? 2.关于EFCore本地数据库有更新的情况 添加了 Migrations文件 怎么在构建的时候去更新 ...

  8. appium入门级教程(1)—— appium介绍

    appium介绍 官方网站与介绍 1.特点 appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用. “移动原生应用”是指那些用iOS或者 ...

  9. Qt QByteArray或者Char转十六进制 QString

    1.QByteArray转十六进制 QByteArray buff = sp->readAll(); qDebug() << buff.toHex() << " ...

  10. 2013-2014 ACM-ICPC Brazil Subregional Programming Contest 题解

    [题目链接] 这场比赛题面英文都好长... ... A - Zero or One 模拟. #include <bits/stdc++.h> using namespace std; in ...