【问题标题】:Logic behind startScroll in scroller?滚动条中 startScroll 背后的逻辑?
【发布时间】:2017-12-13 04:11:10
【问题描述】:
在这个documentation 中我不明白startScroll() 的概念。
上面写着:
正数会将内容向左滚动。
我不明白。如果 0 总是在左边,为什么要向左滚动?如果为负,它将向右滚动。
但是为什么呢?我的头很难缠住它。其背后的逻辑是什么?为什么要积极向左移动?
在游戏和图形编程中,0 将始终位于左上角或左下角,但始终位于左侧。所以用正数向右移动,用负数向左移动是有意义的。但是为什么在 startScroll 上不一样呢?
我只是在问,因为我真的很想知道为什么要这样设计。
【问题讨论】:
标签:
android
scrollview
android-view
android-scrollview
【解决方案1】:
实际上,您正在向右滚动视图,这导致内容视图向左滚动。
拥有|A|B|C|,现在按正值滚动将导致向右滚动,将实际内容向左滚动:|B|C| - A 不再可见,因为它被视为内容并被滚动向左。
【解决方案2】:
我们可以用两种不同的方式来想象卷轴。一是窗口在移动,二是内容在移动。根据getScrollX()的Android文档
返回此视图的滚动左侧位置。这是视图显示部分的左边缘。您不需要在更左侧绘制任何像素,因为它们位于屏幕上视图的框架之外。
很明显,Android 更喜欢内容相应的滚动而不是窗口相应的滚动。在内容中各自滚动
正数会将内容向左滚动。
不仅startScroll(),View.scrollBy()、View.scrollTo() 等其他方法都采用相同的思路。
如果你问“哪个更自然的想象,内容各自还是窗口各自?”,我会说“我不知道”。
【解决方案3】:
为了说明发生了什么,请看图:
- 上图显示坐标系:
(0,0) 位于左上角,正方向为右(x 坐标)和下(y 坐标)。
- 底部插图显示了“视口”移动时的滚动效果。
- 左边是调用滚动前的位置
- 右边是调用滚动后的位置 x=+2, y=+3
- 浅蓝色矩形是屏幕“视口”:滚动方法实际上是移动这个矩形(屏幕的表示),而不是内容。将其视为您通过相机观察世界的相机。
- 红点只是视图上的一个元素,它并没有移动。以你所看的世界来看待它。
您可以看到,在正 x 和 y 方向上移动“视口”会导致红点上的结果似乎是向上和向左移动。就像您将相机向右移动会使视频中的世界向左移动一样。
【解决方案4】:
您的容器视图固定在您的屏幕上。当您向右滚动时,右侧的项目会继续向左流动。因此,当你这样做时
scroller.startScroll (int 2 /*startX */,
int startY,
int dx,
int dy,
int duration);
使您的内容向左滚动。
【解决方案5】:
Scroller实际上是水平或垂直的侧边栏,当有滚动手势时出现。考虑滚动条的移动并观察它在应用程序中的行为。你会明白为什么它是这样实施的。您当前正在考虑触摸位置,导致混乱。