Android: проблема с горизонтальной прокруткой - PullRequest
1 голос
/ 01 июля 2011

У меня есть пользовательские HorizontalScrollView, LinearLayout в качестве дочернего элемента и начальные 9 пользовательских представлений в LinearLayout.

. При прокрутке вправо необходимо добавить еще 3 дочерних элемента.просмотров на LinearLayout, а затем удалите первых трех дочерних, так что только 9 дочерних представлений присутствуют одновременно.

Мы добавили точки обнаружения, основанные на идентификаторах видов, таким образом, что если currentViewId > lastChildId - 0.33f * viewSizeLimit где viewSizeLimit = 9.Если это верно, это время, когда мы добавляем / удаляем виды из LinearLayout.

Первая проблема, с которой я столкнулся, это то, что при удалении видов из LinearLayout дочерние элементы смещаются влево.Так что, если currentViewId = 7, и текущий вид находится в зоне обнаружения, мы добавляем 3 вида в конец и удаляем 3 вида спереди.Так что теперь currentViewId = 4 из-за сдвига.

Мы добавили scrollBy метод HorizontalScrollView, чтобы компенсировать это смещение вида и хорошо работает, если прокрутка не такая быстрая.

Вот пример из журналов:

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, 18661551).Значение -1440, которое мы видим, является компенсацией scrollBy, которую мы добавили, чтобы установить правильный вид, видимый в области просмотра.

Итак, проблема в том, что я не могу понять, почему HorizontalScrollView прокручивает себя на такие большие расстояния.Любая причина для этого случая?

Есть ли лучший способ реализовать это, кроме использования HorizontalScrollView?

Стоит ли использовать для этого игровой движок?

Спасибо.

1 Ответ

0 голосов
/ 01 июля 2011

Я хотел бы предложить использовать галерею, которая в основном является горизонтальным ListView.

Идея состоит в том, что реализация SpinnerAdapter предоставляет галерее вид с шириной 1/9 площади,в противном случае стандартная реализация.Это дало бы вам неограниченную прокрутку, которая, как я думаю (при условии, что я поняла ваши требования), дала бы вам эффект, который вы ищете.У этого также был бы счастливый побочный эффект захвата в положение.

Я надеюсь, что это полезно.

...