【发布时间】:2020-06-26 01:51:39
【问题描述】:
我正在尝试制作一个精美的新 ui 小部件,一个可以在演员之间滚动的边缘轮播:
在上图中,它应该从左边数到 99,然后从 0 开始向右移动。相反,我得到了一些明显的数组损坏。
代码跟踪哪个索引应该在显示中位于前面的中心 (getIndexOfFocus())。由于渲染顺序的挑战,我首先在一个循环中遍历该元素上方的所有元素,然后从数组的开头开始第二个循环,直到并包括中心元素(在所示的示例图片中,中心元素是 6):
SnapshotArray<Actor> children = getChildren();
children.end();
int n = children.size;
for (int i = getIndexOfFocus() + 1; i < n; i++) {
actorSubProcessing(children, i, rowHeight, startY, x);
}
for (int f = 0; f<= getIndexOfFocus(); f++) {
actorSubProcessing(children, f, rowHeight, startY, x);
//children.get(i).toFront();
}
如果我注释掉第一个循环,元素 0-6 会正确显示,而不是 56-50 和 6 在角落弹出。在 actorSubProcessing 方法中,我做了三件事来直接影响 children 数组的元素:
child.setScaleX(child.getScaleX() * scalingAgent);
child.setScaleY(child.getScaleY() * scalingAgent);
if (round)
child.setBounds(Math.round(x), Math.round(y), Math.round(width), Math.round(height));
else
child.setBounds(x, y, width, height);
if (offset > 0)
child.toBack();
我知道 libGDX 数组的特殊之处在于它们会限制垃圾回收,但为什么要在数组的后期处理元素会在数组的早期更改元素呢?顺便说一句,getChildren() 来自 ui.HorizontalDisplay,我在修改为这个新小部件之前对其进行了镜像
我在解决方案中的一个尝试是弄清楚如何克隆数组,但即使我可以想象小部件确定要呈现的内容也会很混乱。我也一直在通过API。我希望能够重新排列我的数组元素的顺序;我认为将显示在中心的元素作为数组中的最后一个元素会有一定的优雅。然后我可以在数组中做一个循环,从开始到数组。我看到您可以使用“比较器”对数组进行排序,但不理解我在那里阅读的内容,不知道这是否是重新排列数组顺序的途径。
【问题讨论】: