1

我小时候有一个 custom HorizontalScrollViewLinearLayoutLinearLayout.

当我向右滚动时,我需要再添加 3 个子视图LinearLayout,然后删除前三个子视图,这样一次只存在 9 个子视图。

我们添加了基于视图 ID 的检测点,其方式是 if the currentViewId > lastChildId - 0.33f * viewSizeLimitwhere viewSizeLimit = 9。如果这是有效的,那就是我们从LinearLayout.

我遇到的第一个问题是,当我从 中删除视图时LinearLayout,孩子会向左移动。因此,如果currentViewId = 7, 和当前视图在检测区域上,那么我们将 3 个视图添加到末尾,并从前面删除 3 个视图。所以现在currentViewId = 4由于转变。

我们添加了scrollBy的方法HorizontalScrollView来补偿这种视图偏移,如果滚动不是那么快,效果很好。

这是日志中的一个示例:

07-01 17:01:34.304: INFO/GTA(2476): currentViewId: 6
07-01 17:01:34.304: INFO/GTA(2476): Scroll Distance: 8
07-01 17:01:34.373: INFO/GTA(2476): currentViewId: 6
07-01 17:01:34.383: INFO/GTA(2476): Scroll Distance: 41
07-01 17:01:34.463: INFO/GTA(2476): currentViewId: 7
07-01 17:01:34.463: INFO/GTA(2476): Scroll Distance: 25
07-01 17:01:34.633: INFO/GTA(2476): Added new views to the end
07-01 17:01:34.643: INFO/GTA(2476): currentViewId: 4
07-01 17:01:34.653: INFO/GTA(2476): Scroll Distance: -1440
07-01 17:01:34.653: INFO/GTA(2476): Head View ID: 4 | Tail View ID: 12
07-01 17:01:34.673: INFO/GTA(2476): currentViewId: 7
07-01 17:01:34.673: INFO/GTA(2476): Scroll Distance: 22
07-01 17:01:34.733: INFO/GTA(2476): currentViewId: 7

这是快速滚动/翻转滚动视图时的日志:

07-01 17:03:48.633: INFO/GTA(2476): currentViewId: 6
07-01 17:03:48.643: INFO/GTA(2476): Scroll Distance: 158
07-01 17:03:48.693: INFO/GTA(2476): currentViewId: 6
07-01 17:03:48.704: INFO/GTA(2476): Scroll Distance: 124
07-01 17:03:48.753: INFO/GTA(2476): currentViewId: 7
07-01 17:03:48.753: INFO/GTA(2476): Scroll Distance: 114
07-01 17:03:48.914: INFO/GTA(2476): Added new views to the end
07-01 17:03:48.914: INFO/GTA(2476): currentViewId: 4
07-01 17:03:48.914: INFO/GTA(2476): Scroll Distance: -1440
07-01 17:03:48.914: INFO/GTA(2476): Head View ID: 4 | Tail View ID: 12
07-01 17:03:48.974: INFO/GTA(2476): currentViewId: 10
07-01 17:03:48.974: INFO/GTA(2476): Scroll Distance: 1843
07-01 17:03:49.194: INFO/GTA(2476): Added new views to the end
07-01 17:03:49.204: INFO/GTA(2476): currentViewId: 7
07-01 17:03:49.204: INFO/GTA(2476): Scroll Distance: -1440
07-01 17:03:49.204: INFO/GTA(2476): Head View ID: 7 | Tail View ID: 15
07-01 17:03:49.253: INFO/GTA(2476): currentViewId: 14
07-01 17:03:49.264: INFO/GTA(2476): Scroll Distance: 1866
07-01 17:03:49.403: INFO/GTA(2476): Added new views to the end
07-01 17:03:49.414: INFO/GTA(2476): currentViewId: 11
07-01 17:03:49.414: INFO/GTA(2476): Scroll Distance: -1440
07-01 17:03:49.414: INFO/GTA(2476): Head View ID: 10 | Tail View ID: 18
07-01 17:03:49.463: INFO/GTA(2476): currentViewId: 18
07-01 17:03:49.463: INFO/GTA(2476): Scroll Distance: 1551
07-01 17:03:49.703: INFO/GTA(2476): Added new views to the end
07-01 17:03:49.713: INFO/GTA(2476): currentViewId: 15
07-01 17:03:49.713: INFO/GTA(2476): Scroll Distance: -1440
07-01 17:03:49.713: INFO/GTA(2476): Head View ID: 13 | Tail View ID: 21

从日志中可以看出,这些HorizontalScrollView卷轴本身的数量绝对是巨大的(即1843年、1866年、1551年)。-1440我们看到的值是scrollBy我们为设置在视口中可见的正确视图而添加的补偿。

所以现在的问题是我似乎无法找出为什么HorizontalScrollView卷轴本身会如此大的距离。出现这种情况有什么原因吗?

除了使用 a 之外,还有没有更好的方法来实现这一点HorizontalScrollView

我应该考虑为此使用游戏引擎吗?

谢谢。

4

1 回答 1

0

我想建议使用一个画廊,它基本上是一个水平的 ListView。

这个想法是 SpinnerAdapter 实现为画廊提供宽度为区域 1/9 的视图,但在其他方面是标准实现。这会给你无限的滚动,我认为(假设我已经理解你的要求)会给你你正在寻找的效果。它还会产生卡入位置的愉快副作用。

我希望这会有所帮助。

于 2011-07-01T09:50:24.003 回答