Синхронизировать положение двух представлений ScrollView - PullRequest
6 голосов
/ 20 марта 2010

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

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

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

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

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

Ответы [ 5 ]

1 голос
/ 06 апреля 2010

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

1 голос
/ 27 июня 2013

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

1 голос
/ 20 марта 2010

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

0 голосов
/ 25 ноября 2016

Я достиг того же расположения, выполнив следующие действия.

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

Вам нужно сослаться ниже на два ответа stackoverflow.

  1. SynchedScrollView andig answer
  2. оптимизировано SynchedScrollПросмотреть мой ответ

отметьте ниже 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 для динамического создания таблицы.

Это скриншот макета This is screen shot of layout

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

0 голосов
/ 27 июня 2013

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

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

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

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

-

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

...