Логика позади startScroll в скроллере?

Я не понимаю startScroll() в этой документации.

Это говорит:

Положительные числа будут прокручивать содержимое влево.

Я не понимаю. Если 0 всегда слева, почему прокрутка влево? И если отрицательный, он будет прокручиваться вправо.

Но почему? Просто так трудно обернуть мою голову вокруг этого. Какая логика стоит за этим? Зачем делать позитивный шаг влево?

В программировании игр и графики 0 всегда будет либо слева вверху, либо слева от бота, но всегда будет слева. Так что имеет смысл двигаться вправо с положительными числами и двигаться влево с отрицательными. Но почему это отличается от startScroll?

Я просто спрашиваю, потому что мне действительно любопытно, почему разработал это так.

5 ответов

Решение

Чтобы проиллюстрировать, что происходит, см. Чертеж:

  • На верхних чертежах показана система координат: (0,0) находится вверху слева, а положительные направления - вправо (координата x) и вниз (координата y).
  • На нижних рисунках показан эффект прокрутки, отображаемой при перемещении "порта просмотра".
  • Слева находится позиция перед вызовом для прокрутки
  • Справа находится позиция после вызова прокрутки по x=+2, y=+3
  • Голубой прямоугольник - это экран "вид порта": метод прокрутки фактически перемещает этот прямоугольник (представление экрана), а не содержимое. Посмотрите на это как на камеру, через которую вы смотрите на мир.
  • Красная точка - это просто элемент, расположенный на виде, и он не движется. Посмотрите на это как на мир, на который вы смотрите.

Вы можете видеть, что перемещение "порта просмотра" в положительных направлениях x и y на красной точке, кажется, движется вверх и влево. Так же, как вы перемещаете камеру вправо, мир в видео движется влево.

Вы фактически прокручиваете представление вправо, в результате чего представление содержимого прокручивается влево.

имеющий |A|B|C|, теперь прокрутка по положительному значению приведет к прокрутке вправо, которая прокручивает фактическое содержимое влево: |B|C| - A больше не виден, потому что рассматривается как контент и прокручивается влево.

Скроллер - это горизонтальная или вертикальная боковая панель, которая появляется при жесте прокрутки. Подумайте о движении относительно скроллера и наблюдайте за его поведением в приложении. Вы поймете, почему это так. Вы в настоящее время думаете относительно позиции касания, вызывая путаницу.

Ваш Контейнер Вид фиксируется на вашем экране. Когда вы прокручиваете вправо, правые элементы продолжают течь влево. Таким образом, когда вы делаете

scroller.startScroll (int 2 /*startX */, 
                int startY, 
                int dx, 
                int dy, 
                int duration); 

делает ваш контент будет прокручиваться влево.

Мы можем представить свиток двумя разными способами. Одна из них заключается в том, что окно перемещается, а другая - в том, что содержимое перемещается. Согласно документации Android getScrollX()

Верните прокрученную левую позицию этого вида. Это левый край отображаемой части вашего вида. Вам не нужно рисовать какие-либо пиксели дальше влево, поскольку они находятся за пределами рамки вашего обзора на экране.

Понятно, что Android предпочитает прокрутку, соответствующую контенту, а не окну, соответствующему окну. В содержании соответствующих свитков

Положительные числа будут прокручивать содержимое влево.

Не только startScroll()другие методы, такие как View.scrollBy(), View.scrollTo()и т. д. работают с той же идеей.

Если вы спросите "что является более естественным воображением, соответствующим содержанием или соответствующим окном?", Я скажу "я не знаю".

Другие вопросы по тегам