【发布时间】:2011-07-01 09:12:33
【问题描述】:
我小时候有一个自定义HorizontalScrollView、LinearLayout,以及LinearLayout 下的初始 9 个自定义视图。
当我向右滚动时,我需要向LinearLayout 添加另外 3 个子视图,然后删除前三个子视图,这样一次只存在 9 个子视图。
我们添加了基于视图 ID 的检测点,这样如果 currentViewId > lastChildId - 0.33f * viewSizeLimit where viewSizeLimit = 9.如果这是有效的,那就是我们从 LinearLayout 添加/删除视图的时间。
我遇到的第一个问题是,当我从LinearLayout 中删除视图时,子项向左移动。因此,如果currentViewId = 7,并且当前视图在检测区域上,那么我们将 3 个视图添加到末尾,并从前面删除 3 个视图。所以现在currentViewId = 4 由于转移。
我们添加了HorizontalScrollView 的scrollBy 方法来补偿这种视图偏移,并且在滚动速度不是那么快的情况下效果很好。
这是日志中的一个示例:
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 会自行滚动如此大的距离。出现这种情况有什么原因吗?
除了使用HorizontalScrollView之外,还有什么更好的实现方式吗?
我应该考虑为此使用游戏引擎吗?
谢谢。
【问题讨论】:
标签: android scrollview horizontalscrollview