У меня есть пользовательские 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
?
Стоит ли использовать для этого игровой движок?
Спасибо.