滚动器中 startScroll 背后的逻辑?
Logic behind startScroll in scroller?
我不明白 startScroll()
在这个 documentation 中的意思。
它说:
Positive numbers will scroll the content to the left.
我不明白。如果 0 总是在左边,为什么要向左滚动正向?如果为负,它将向右滚动。
但是为什么呢?我很难理解它。其背后的逻辑是什么?为什么积极向左移动?
在游戏和图形编程中,0 将始终位于左上角或左下角,但它始终位于左侧。因此,正数向右移动,负数向左移动是有意义的。但是为什么在 startScroll 上不一样?
我只是问问,因为我真的很好奇为什么要这样设计。
您实际上是将视图向右滚动,这导致内容视图向左滚动。
有了 |A|B|C|
,现在按正值滚动将导致向右滚动,从而将实际内容向左滚动:|B|C|
- A
不再可见,因为它被视为内容并向左滚动。
我们可以用两种不同的方式想象一个卷轴。一个是 window 在移动,另一个是内容在移动。根据 Android 的 getScrollX()
文档
Return the scrolled left position of this view. This is the left edge of the displayed part of your view. You do not need to draw any pixels farther left, since those are outside of the frame of your view on screen.
很明显 Android 更喜欢相应的内容滚动而不是 window 相应的内容。在内容各自的卷轴
Positive numbers will scroll the content to the left.
不仅startScroll()
,其他方法如View.scrollBy()
、View.scrollTo()
等也是同样的思路。
如果你问"which is more natural imagination, content respective or window respective?",我会说"I don't know"。
为了说明发生了什么,请看图:
- 上图显示坐标系:
(0,0)
在左上角,正方向为右(x坐标)和下(y坐标)。
- 底部的插图显示了 "view port" 移动时卷轴的效果。
- 左边是滚动调用前的位置
- 右边是x=+2,y=+3调用滚动后的位置
- 浅蓝色矩形是屏幕"view port":滚动方法实际上移动的是这个矩形(屏幕的表示),而不是内容。把它看成你通过相机看世界。
- 红点只是定位在视图上的一个元素,它并没有移动。把它看成你看的世界。
您可以看到,在正 x 和 y 方向上移动 "view port" 会导致红点看起来向上和向左移动。就像你把相机向右移动,视频中的世界也会向左移动。
您的容器视图固定在屏幕上。当您向右滚动时,右边的项目会一直向左流动。因此,当你
scroller.startScroll (int 2 /*startX */,
int startY,
int dx,
int dy,
int duration);
使您的内容向左滚动。
Scroller实际上是水平或垂直侧边栏,当有滚动手势时出现。考虑滚动条的运动并观察它在应用程序中的行为。你会明白为什么它是这样实现的。您目前正在考虑触摸位置,造成混淆。
我不明白 startScroll()
在这个 documentation 中的意思。
它说:
Positive numbers will scroll the content to the left.
我不明白。如果 0 总是在左边,为什么要向左滚动正向?如果为负,它将向右滚动。
但是为什么呢?我很难理解它。其背后的逻辑是什么?为什么积极向左移动?
在游戏和图形编程中,0 将始终位于左上角或左下角,但它始终位于左侧。因此,正数向右移动,负数向左移动是有意义的。但是为什么在 startScroll 上不一样?
我只是问问,因为我真的很好奇为什么要这样设计。
您实际上是将视图向右滚动,这导致内容视图向左滚动。
有了 |A|B|C|
,现在按正值滚动将导致向右滚动,从而将实际内容向左滚动:|B|C|
- A
不再可见,因为它被视为内容并向左滚动。
我们可以用两种不同的方式想象一个卷轴。一个是 window 在移动,另一个是内容在移动。根据 Android 的 getScrollX()
文档Return the scrolled left position of this view. This is the left edge of the displayed part of your view. You do not need to draw any pixels farther left, since those are outside of the frame of your view on screen.
很明显 Android 更喜欢相应的内容滚动而不是 window 相应的内容。在内容各自的卷轴
Positive numbers will scroll the content to the left.
不仅startScroll()
,其他方法如View.scrollBy()
、View.scrollTo()
等也是同样的思路。
如果你问"which is more natural imagination, content respective or window respective?",我会说"I don't know"。
为了说明发生了什么,请看图:
- 上图显示坐标系:
(0,0)
在左上角,正方向为右(x坐标)和下(y坐标)。 - 底部的插图显示了 "view port" 移动时卷轴的效果。
- 左边是滚动调用前的位置
- 右边是x=+2,y=+3调用滚动后的位置
- 浅蓝色矩形是屏幕"view port":滚动方法实际上移动的是这个矩形(屏幕的表示),而不是内容。把它看成你通过相机看世界。
- 红点只是定位在视图上的一个元素,它并没有移动。把它看成你看的世界。
您可以看到,在正 x 和 y 方向上移动 "view port" 会导致红点看起来向上和向左移动。就像你把相机向右移动,视频中的世界也会向左移动。
您的容器视图固定在屏幕上。当您向右滚动时,右边的项目会一直向左流动。因此,当你
scroller.startScroll (int 2 /*startX */,
int startY,
int dx,
int dy,
int duration);
使您的内容向左滚动。
Scroller实际上是水平或垂直侧边栏,当有滚动手势时出现。考虑滚动条的运动并观察它在应用程序中的行为。你会明白为什么它是这样实现的。您目前正在考虑触摸位置,造成混淆。