7

我正在尝试同步两个 ScrollViews 的位置。我正在尝试这样做以显示电视指南列表。

我创建了一个扩展 RelativeLayout 以显示指南的自定义类。此相对布局有四个子项:左上角的 imageview、右上角显示列标题的 Horizo​​ntalScrollView、左下角显示行标题的 ScrollView 和包含列表的右下角的 ScrollView . 然后,此 ScrollView 包含一个 Horizo​​ntalScrollView,后者又包含一个带有多个显示数据的子视图的 LinearLayout。我希望这可以清楚地解释它,但这里有一个图表可以更清楚地说明:

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

我这样设置它是因为我希望指南列表可以水平和垂直滚动,但是没有滚动视图可以做到这一点。此外,我希望行标题和列标题显示,无论指南列表在什么位置,但我希望它们正确排列。所以我试图找到一种方法来同步两个hsv的位置,同时也同步两个sv的位置。我也在尝试以一种避免每隔几毫秒运行一个处理程序来轮询一个视图并在另一个视图上调用 scrollTo 的方式来做到这一点。

我不确定这是最好的方法,但这就是我想出的。如果有人有任何其他建议,请随时提出!

4

5 回答 5

1

处理触摸事件是不够的,因为如果您进行快速滑动,则在释放触摸后滚动会持续一段时间。解决方案是覆盖 computeScroll() 方法。看看https://github.com/chrisjenx/ParallaxScrollView它是如何在那里完成的。

于 2013-06-27T14:27:09.950 回答
1

在所有面板中实现onTouchEvent(MotionEvent me)不值得吗?当您的一个面板滚动时,将调用此方法,它可以确保所有其他面板保持同步。

于 2010-03-20T03:20:30.093 回答
1

处理触摸事件不能 100% 工作。不同视图中的滚动量可能并不总是同步。

于 2010-04-06T11:36:56.380 回答
0

你可以看看这篇文章:链接

这家伙实际上在做什么,他创建了自定义 ScrollViews 并覆盖了方法onScrollChanged,添加了一个监听器,然后在它们被绘制到屏幕之前同步它们。

您现在可以做的是在 a 中添加作为主框架ScrollViewa HorizontalScrollView。左边栏是 a HorizontalScrollView,顶部是 a ScrollView。然后你将 mainScrollView和 main分别注册HorizontalScrollView为两个ScrollManagers(参见上面的链接)。

然后禁用 hsv 和 sv 的滚动并将它们添加到适当的ScrollManagers. 然后一切都应该正常工作。

-

PS。如果您只使用侦听器本身而不使用ScrollManager,那么您将有 1 帧的同步延迟。

于 2013-06-27T14:51:23.050 回答
0

我通过执行以下操作实现了相同的布局。

你会发现 xml 中的 SyncedScrollView 是自定义的滚动视图,用于同步两个滚动视图。

您需要参考以下两个 stackoverflow 答案。

  1. SynchedScrollView 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 以动态创建表格。

这是布局的屏幕截图 这是布局的屏幕截图

对不起我纯英语。

于 2016-11-25T12:46:16.700 回答