cocos2d-x改底层之获取UIListView的实际内容大小
实际项目中UI界面中常常会用到UIListView。大多会在CocoStudio中直接加入这个控件。
可是在使用中发现了一些坑和功能缺乏,然后就看了一下底层的逻辑,发现略微改一下底层就能够满足需求,所以以下就针对需求来分析UIListView的底层。同一时候做一些修改。
需求:依据链表中的内容来动态调整listView本身的大小
void ListView::pushBackDefaultItem()
{
if (!_model)
{
return;
}
/* 克隆一份模板,并加入到项的数组里 */
Widget* newItem = _model->clone();
_items->addObject(newItem);
/* 依据listView的基础设置来调整新加项的布局关系 */
remedyLayoutParameter(newItem);
addChild(newItem);
/* 重点:打开刷新开关 */
_refreshViewDirty = true;
}
这里最后一句才是重点。仅仅有刷新了才会真正计算新的显示,之前的修改才真正生效。所以放我们加入一项的时候,当前帧事实上并没有马上刷新。假设这时候获取大小。仅仅会和之前的一样,并没有改变,那么我们要知道,开关_refreshViewDirty是在什么时候起作用了呢,例如以下:
void ListView::sortAllChildren()
{
ScrollView::sortAllChildren();
if (_refreshViewDirty)
{
/* 刷新 */
refreshView();
_refreshViewDirty = false;
}
}
void ListView::refreshView()
{
ccArray* arrayItems = getItems()->data;
int length = arrayItems->num;
for (int i=0; i<length; i++)
{
Widget* item = static_cast<Widget*>(arrayItems->arr[i]);
item->setZOrder(i);
remedyLayoutParameter(item);
}
/* 更新内容大小 */
updateInnerContainerSize();
}
能够看到。最关键的改变大小的函数updateInnerContainerSize():
定义一个变量用来保存真实大小,原因是listView本身计算大小的结果并非以内容为准,而是以最初用户设置的大小,那么真实的大小会被遗弃,所以我们要保存住她:
CCSize _actualInnerSize;
void ListView::updateInnerContainerSize()
{
switch (_direction)
{
case SCROLLVIEW_DIR_VERTICAL:
{
/*...*/ /* 保存真实大小 */
_actualInnerSize = CCSize(finalWidth, finalHeight);
setInnerContainerSize(_actualInnerSize);
break;
}
case SCROLLVIEW_DIR_HORIZONTAL:
{
/*...*/ /* 保存真实大小 */
_actualInnerSize = CCSize(finalWidth, finalHeight);
setInnerContainerSize(_actualInnerSize);
break;
}
default:
break;
}
}
setInnerContainerSize(_actualInnerSize);这个函数是在父类定义的:
void ScrollView::setInnerContainerSize(const CCSize &size)
{
/* 获取用户设置的大小(没设置就是默认的) */
float innerSizeWidth = _size.width;
float innerSizeHeight = _size.height;
/* 获取原始大小 */
CCSize originalInnerSize = _innerContainer->getSize();
/* 更新后的新的内容大小与设置的大小作比較 */
if (size.width < _size.width)
{
/* 假设新的内容大小比设置的要小,输出提示,并以设置的大小为准,大小不改变 */
CCLOG("Inner width <= scrollview width, it will be force sized!");
}
else
{
/* 假设新的内容大小比设置的要大。则以新内容大小为准 */
innerSizeWidth = size.width;
}
if (size.height < _size.height)
{
CCLOG("Inner height <= scrollview height, it will be force sized!");
}
else
{
innerSizeHeight = size.height;
}
_innerContainer->setSize(CCSize(innerSizeWidth+5, innerSizeHeight+10));
}
在updateInnerContainerSize函数中我们以保存了实际内容大小,须要写一个get函数来获取:
CCSize ListView::getActualInnerSize()
{
/* 重点:马上(当前帧)运行刷新。更新大小 */
refreshView();
return _actualInnerSize;
}
最后实现需求:listView->setSize(getActualInnerSize())
上面是在CocoStudio中加入的UIListView控件,假设是手动创建的话有三点注意:
为了可以滚动,要实现两个条件
①:setTouchEnable(true)
②:一定要将UIListView 放入到UILayer中,仅仅有UILayer才会监听UI系列触摸。CCLayer不能够
所以须要创建一个UILayer* layer;layer->addWidget(list);//一定是addWidget。表示以挂件形式加入,addChild不能够。最后再addChild(layer)。
③:向列表中加入控件时,列表会自己主动排好位置,此时位置是不受手动管理的(并且位置通常不正确,中心点在左上角,我们无法改变,做相对偏移等);但有时候我们为了调整位置,仅仅能加入中间层。如UILayout。而UILayout要注意的是,它相当于一个层,坐标计算和层一样。
cocos2d-x改底层之获取UIListView的实际内容大小的更多相关文章
- java中CRUD(增删查改)底层代码的实现
java中CRUD(增删查改)底层代码的实现: package com.station.dao; import com.station.model.Product; import java.sql.* ...
- python3获取一个网页特定内容
我们今天要爬取的网址为:https://www.zhiliti.com.cn/html/luoji/list7_1.html 一.目标:获取下图红色部分内容 即获取所有的题目以及答案. 二.实现步骤. ...
- 转 使用utl_http获取某个http页面内容
#########1.ACL详细解释: 11g 对于XDB UTL_HTTP or others package 的权限管控进一步加强,如果需要使用到XDB 以下包 UTL_TCP, UTL_SMT ...
- 织梦DEDECMS {dede:arclist},{dede:list}获取附加表字段内容
以前用织梦DEDECMS做二次开发时获取附加表字段内容都是通过runphp执行SQL查询获得,最近看了看手册,发现一个非常简便的方法. 用arclist调用于附加表字段的方法: 方法一: 要获取附加表 ...
- Shell 获取指定行的内容
需求: 有一个文件,根据指定的字符串,得到该字符串上两行的内容. 文件内容如下: linux-56:# cat sys.ttconnect.ini # Copyright (C) 1999, 2006 ...
- jquery获取文本框的内容
使用jquery获取文本框的内容有以下几种: 1.根据ID取值(id属性): // javascript <script type="text/javascript"> ...
- Android中获取应用程序(包)的大小-----PackageManager的使用(二)
通过第一部分<<Android中获取应用程序(包)的信息-----PackageManager的使用(一)>>的介绍,对PackageManager以及 AndroidMani ...
- PHP高效获取远程图片尺寸和大小(转)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- Android 获取系统短信内容
//这里通过内容提供者获取系统短信内容 Uri uri = Uri.parse("content://sms/"); String[] projection = {"_i ...
随机推荐
- vmware 装 puppy
说做就做了,但是开始怎么试都没装成功,后来在网上查了些资料,再结合自己的实践,终于成功了.下面我就把如何让Puppy Linux安装到VMware 硬盘上一步一步奉献给大家. 一.准备 1.1 安装好 ...
- Java-确定一个类对象代表一个类还是接口
package com.tj; public class MyClass implements Cloneable { public static void main(String[] args) { ...
- 高级java、C#、php、SQL、JavaScript......+n多编程语言学习分享
/*入园两周年纪念.在搬砖之路一去不返*/ //搬砖什么都好,就是有点伤Ctrl键. <div style="display:none;"> </div>
- 【drp 12】再识转发和重定向:SpringMVC无法跳转页面
最近再使用SpringMVC进行页面跳转的时候,不知道发生了什么,始终都无法正确跳转.后来问题解决了,发现是对于转发和重定向没有能很好的理解,以此写篇博客,权当做积累了! 声明:本博客的所有代码,均为 ...
- mysql的row_number()实现
在mysql中没有row_number()方法,这里模拟row_number()实现: 如有表 studentid name age class1 张1 15 12 张2 15 ...
- 【Luogu】P1850换教室(期望DP)
题目链接 又一道面向题解编程的恶心神题.真是叫人质壁分离…… 设f[i][j][k]表示考虑了前i节课,尝试了j次,当前申请结果为k时消耗的体力值. 对于f[i][j][0]有两种情况:一是我们的主角 ...
- 【Luogu】P3384主席树模板(主席树查询K小数)
YEAH!我也是一个AC主席树模板的人了! 其实是个半吊子 我将尽量详细的讲出我的想法. 主席树太难,我们先搞普通线段树好了 普通线段树怎么做?我的想法是查询K次最小值,每次查完把查的数改成INF,查 ...
- mysql5.7.23版本环境配置
亲身实践安装mysql,用时居然花费了三个小时,在有那么多教程的情况下,依然在不该花费时间的路上浪费了太多时间.希望这篇文章能够帮助大家少走弯路~~ 1.下载我下载的是64位. 2.解压下载之后,我选 ...
- BZOJ 1007 [HNOI2008]水平可见直线 ——计算几何
用了trinkle的方法,半平面交转凸包. 写了一发,既没有精度误差,也很好写. #include <map> #include <ctime> #include <cm ...
- ⑨要写信(codevs 1697)
题目描述 Description 琪露诺(冰之妖精)有操控冷气的能力.能瞬间冻结小东西,比普通的妖精更危险.一直在释放冷气的她周围总是非常寒冷. 由于以下三点原因…… 琪露诺的符卡 冰符“Icicle ...