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 ...
随机推荐
- java复习之基础环境
环境基本介绍: JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK).在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为b ...
- PAT Basic 1068
1068 万绿丛中一点红 对于计算机而言,颜色不过是像素点对应的一个 24 位的数值.现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 ...
- JQuery中xxx is not a function或者can not find $
在项目中,遇到以上两个错误,反复折腾了好久,js代码写得没有问题,jquery的文件也引入了,就是反复的报告错误,xxx is not a function.如图: 就是这样的错误,shake is ...
- Android自动化测试Uiautomator--UiDevice接口简介
Uiautomator主要分为UiDevice, UiObject, UiScrollable, UiSelector, UiCollection几个类. getUiDevice()方法可以得到一个U ...
- 误删除innodb ibdata数据文件-之恢复
今天在群里看到有人说不熟悉innodb把ibdata(数据文件)和ib_logfile(事务日志)文件误删除了.不知道怎么解决.当时我也不知道怎么办.后来查阅相关资料.终找到解决方法.其实恢复也挺简单 ...
- Flash生成HTML5动画方法
方法一:利用“swiffy”将Flash转换成HTML5动画. 首先,我们需要下载一款基于“Flash”程序的插件,名称为“swiffy”,这是一款由谷歌推出的一个Flash扩展,可以通过“Fla ...
- mysql无法启动,报错 Can't start server: can't create PID file: No space left on device
然后看mysql日志文件 出现Can't start server: can't create PID file: No space left on device 这个错误. 提示磁盘空间不足 后用d ...
- springboot的使用体验和思考
首先,写这篇博客的背景: 1,通过maven使用springboot创建项目,进行了简单的页面跳转,并未编写service和DAL层,也就是说,并未整合持久化框架 2,阅读了maven的官方文档.sp ...
- 【Luogu】P1593因子和(唯一分解定理,约数和公式)
题目链接 首先介绍两个定理. 整数唯一分解定理:任意正整数都有且只有一种方式写出素数因子的乘积表达式. \(A=(p1k1 p2k2 ...... pnkn \) 求这些因子的代码如下 ;i*i< ...
- HackerRank# Red John is Back
原题地址 简单动归+素数判定,没用筛法也能过 代码: #include <cmath> #include <cstdio> #include <vector> #i ...