【问题标题】:Android: HorizontalScrollView Scrolling IssueAndroid:Horizo​​ntalScrollView 滚动问题
【发布时间】:2011-07-01 09:12:33
【问题描述】:

我小时候有一个自定义HorizontalScrollViewLinearLayout,以及LinearLayout 下的初始 9 个自定义视图。

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

我们添加了基于视图 ID 的检测点,这样如果 currentViewId > lastChildId - 0.33f * viewSizeLimit where viewSizeLimit = 9.如果这是有效的,那就是我们从 LinearLayout 添加/删除视图的时间。

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

我们添加了HorizontalScrollViewscrollBy 方法来补偿这种视图偏移,并且在滚动速度不是那么快的情况下效果很好。

这是日志中的一个示例:

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


    【解决方案1】:

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

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

    我希望这会有所帮助。

    【讨论】:

    • 谢谢菲利普。我们已经考虑过使用Gallery,但捕捉效果也是我们试图避免的。基本上,滚动应该尽可能流畅。
    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多