Синхронизировать положение двух представлений ScrollView

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

Я создал пользовательский класс, который расширяет RelativeLayout, чтобы отобразить руководство. Этот относительный макет имеет четыре дочерних элемента: изображение в левом верхнем углу, HorizontalScrollView для отображения заголовков столбцов в правом верхнем углу, ScrollView для отображения заголовков строк в левом нижнем углу и ScrollView в правом нижнем углу, который содержит списки , Этот ScrollView затем содержит HorizontalScrollView, который, в свою очередь, содержит LinearLayout с несколькими дочерними представлениями, отображающими данные. Надеюсь, это объясняет это четко, но вот диаграмма, чтобы сделать ее более ясной:

____________ |__|___hsv___| | | | | | sv -> | | | hsv -> | |sv| ll -> | | | etc | | | | |__|_________| 

Я настроил это так, потому что я хотел, чтобы списки направляющих прокручивались как по горизонтали, так и по вертикали, но нет прокрутки, которые делают это. Кроме того, я хочу, чтобы заголовки строк и столбцов отображались независимо от того, в какой позиции находятся списки указателей, но я хочу, чтобы они были правильно выстроены. Поэтому я пытаюсь найти способ синхронизации позиций двух hsv, а также синхронизировать позиции двух sv. Я также пытаюсь сделать это таким образом, чтобы избежать просто запуска обработчика каждые несколько миллисекунд, чтобы опросить один вид и вызвать scrollTo с другой.

Я никоим образом не уверен, что это лучший способ сделать это, но это то, что я придумал. Если у кого-нибудь есть другие предложения, пожалуйста, не стесняйтесь!

Разве это не стоило бы использовать onTouchEvent (MotionEvent me) во всех ваших панелях? Когда прокручивается одна из ваших панелей, этот метод будет вызываться, и он может следить за тем, чтобы все остальные были синхронизированы.

Обработка событий касания не работает на 100%. Количество свитков в разных представлениях может быть не всегда синхронизировано.

Обработка событий касания недостаточна, потому что, если вы делаете быстрый щелчок, прокрутка продолжается некоторое время после отпускания касания. Решение заключается в переопределении метода computeScroll (). Посмотрите на https://github.com/chrisjenx/ParallaxScrollView, как это делается там.

Вы можете посмотреть этот пост: Ссылка

Фактически этот парень создает пользовательские ScrollViews и переопределяет метод onScrollChanged , добавляет слушателя, а затем синхронизирует их, прежде чем они будут нарисованы на экране.

Теперь вы можете добавить в качестве основного кадра ScrollView в HorizontalScrollView . Левая панель будет HorizontalScrollView , а сверху – ScrollView . Затем вы регистрируете основной ScrollView и главный HorizontalScrollView для двух отдельных ScrollManagers (см. Ссылку выше).

Затем отключите прокрутку hsv и sv и добавьте их в соответствующие ScrollManagers . Тогда все должно работать нормально.

PS. Если вы будете использовать только сами слушатели, а не ScrollManager , у вас будет задержка синхронизации в 1 кадр.

Я достиг такого же макета, делая вещи ниже.

Вы увидите, что SyncedScrollView в xml – это обычное scrollview, используемое для синхронизации двух списков прокрутки.

Вы должны указать ниже два ответа stackoverflow.

  1. SyngedScrollView andig ответ
  2. Оптимизированный SynchedScrollView мой ответ

Проверьте ниже xml

 <RelativeLayout android:id="@+id/activity_main_linear_before_all_scroll" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/activity_main_empty_box" android:layout_width="50dp" android:layout_height="30dp" android:text="xx" android:gravity="center" /> <com.example.SyncedScrollView android:id="@+id/activity_main_observable_scrollview_1" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_below="@+id/activity_main_empty_box" android:fadeScrollbars="false" android:overScrollMode="never" android:scrollbars="none"> <LinearLayout android:id="@+id/activity_main_linear_left_headers" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="row 1" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="row 2" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="row 3" /> </LinearLayout> </com.example.SyncedScrollView> <HorizontalScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_toEndOf="@+id/activity_main_empty_box" android:layout_toRightOf="@+id/activity_main_empty_box" android:fadeScrollbars="false" android:overScrollMode="never"> <RelativeLayout android:id="@+id/activity_main_body_relative" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <LinearLayout android:id="@+id/activity_main_top_headers" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="column 1" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="column 2" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="column 3" /> </LinearLayout> <com.example.SyncedScrollView android:id="@+id/activity_main_observable_scrollview_2" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/activity_main_top_headers" android:fadeScrollbars="false" android:overScrollMode="never" android:scrollbars="vertical"> <LinearLayout android:id="@+id/activity_main_body" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:id="@+id/activity_main_body_row_1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="1,1" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="1,2" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="1,3" /> </LinearLayout> <LinearLayout android:id="@+id/activity_main_body_row_2" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="2,1" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="2,2" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="2,3" /> </LinearLayout> <LinearLayout android:id="@+id/activity_main_body_row_3" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="3,1" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="3,2" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="3,3" /> </LinearLayout> </LinearLayout> </com.example.SyncedScrollView> </RelativeLayout> </HorizontalScrollView> </RelativeLayout> 

Каждая ячейка TextView здесь. Поэтому вы можете установить выделение фона для рисования ящиков (это будет выглядеть как таблица)

Также можно динамически добавлять левые заголовки, верхние заголовки и тело TextView динамически, чтобы динамически создавать таблицы.

Это скриншот макета Это скриншот макета

Извините за мой чистый английский.