网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月25日
漏签
0
天
godot吧
关注:
6,753
贴子:
33,562
看贴
图片
吧主推荐
游戏
1
2
下一页
尾页
19
回复贴,共
2
页
,跳到
页
确定
<<返回godot吧
>0< 加载中...
自己写一个无限循环列表
只看楼主
收藏
回复
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
关于无限循环列表,在Godot中并无实现,当我们的数据多到一定程度的时候绘制滚动的item内的内容会有很大的开销,所以打算自己写个无限滚动列表,目前的设想是生成几个item充满ScrollView,当滚动到最后一个item时,把最上面的item拿到最下面,根据数据的不同刷新每个item的显示,可以支持不同的item在列表内滚动。
保持更新。。。
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
首先是节点结构,我要在ScrollContainer的基础上进行改进,由于常用的VerticalBoxContainer内的子节点不能自定义位置所以这里我们用Control
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
新建脚本InfiniteScrollContainer,继承ScrollContainer。然后第一步,我们需要根据InfiniteScroll节点Rect范围确定需要生成用于的item的数量
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
visible_items = min(ceili(get_rect().size.y/ITEM_HEIGHT),total_items) + 1
total_items是列表中所有的数据数量,Item_height是每个item的高度,在这我们先实现高度一致的item循环列表,然后一步一步来,我们需要在屏幕显示最大的数量多基础上+1,因为会出现最上面和最下面的item每个显示一半的情况
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
确定content节点的高度:content_size = total_items*ITEM_HEIGHT
然后把conten的高度设置好 content.custom_minimum_size = Vector2(0,content_size)
这里我用的custom_minimum_size
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
初始化初始位置和终止位置:
start_index = 0
end_index = min(start_index + visible_items,total_items)
这两个值能够确定所有的item在conten中的位置信息
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
然后生成需要显示的Item:
我的Item叫InfiniteScrollContainerItem
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
监听滚动事件来挪动位置
get_v_scroll_bar().connect("value_changed",_on_VScrollBar_value_changed)
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
贴一下初步实现的代码,现在挪动一下所有的item都需要挪动位置,还需要优化,利用中午的时间发个帖,希望可以多交流交流
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
下一步还打算支持多类型多高度item,晚上有时间搞下
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
继续搞,今天准备优化一下把item尺寸不等高的功能加进去
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
首先,我们让每个item都携带一个尺寸修改下数据类
把我们的item当成一个外壳,每个item都会被传进该数据类,然后item设置数据的时候根据_item_height设置高度
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
把InfiniteScrollContainer中的数据分页,防止计算高度的时候开销太大
var page:Array = [] 这个page内部是每页的数据数组
const PAGE_DATA_SIZE = 10暂定每页数据是10个
var start_index = 0
var end_index = 0
var start_page = 0
var end_page = 0
设置显示范围内的数据下标范围,来支持跨页显示
var page_height:Array[float] = []
记录每页的高度用来计算当前item在content的位置
var item_to_index = {} key是数据index value是item 用于缓存当前显示的item
var item_to_remove = [] 用于缓存多余的item备用
数据的index = 当前页 page * PAGE_DATA_SIZE + 数据所在页index
page = 数据index/PAGE_DATA_SIZE
数据所在页index = 数据index%PAGE_DATA_SIZE
你不是颗好白菜
GDScript
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
设置数据的方法,外部调用
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示