【问题标题】:Synchronize the position of two ScrollView views同步两个 ScrollView 视图的位置
【发布时间】:2010-03-20 01:26:58
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • @Billy...你找到解决方案了吗?

标签: android views scroll scrollview horizontalscrollview


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你可以看看这个帖子:Link

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

        您现在可以做的是在HorizontalScrollView 中添加ScrollView 作为主框架。左边栏是HorizontalScrollView,顶部是ScrollView。然后你将主要的ScrollView 和主要的HorizontalScrollView 注册到两个单独的ScrollManagers(见上面的链接)。

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

        -

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

        【讨论】:

          【解决方案5】:

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

          你会发现xml中的SyncedScrollView是自定义的scrollview,用来同步两个scrollview。

          你需要参考下面两个stackoverflow的答案。

          1. SynchedScrollView andig answer
          2. 优化SynchedScrollView my answer

          检查下面的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 以动态创建表格。

          这是布局的屏幕截图

          对不起,我的纯英语。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-22
            • 2012-08-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多