我正在尝试同步两个ScrollView的位置。我正在尝试这样做以显示电视指南列表。
我创建了一个自定义类,它扩展了RelativeLayout以显示指南。这个相对布局有四个子项:左上角的imageview,右上角显示列标题的HorizontalScrollView,左下角显示行标题的ScrollView,以及右下角包含列表的ScrollView 。然后,此ScrollView包含一个HorizontalScrollView,而HorizontalScrollView又包含一个LinearLayout,其中包含多个显示数据的子视图。我希望这能清楚地解释清楚,但这是一个让它更清晰的图表:
____________
|__|___hsv___|
| | |
| | sv -> |
| | hsv -> |
|sv| ll -> |
| | etc |
| | |
|__|_________|
我这样设置是因为我希望指南列表水平和垂直滚动,但是没有滚动视图可以做到这一点。此外,无论指南列表处于什么位置,我都希望显示行标题和列标题,但我希望它们能够正确排列。所以我试图找到一种方法来同步两个hsv的位置,并同步两个sv的位置。我也尝试这样做,避免每隔几毫秒运行一个处理程序来轮询一个视图并调用另一个视图的scrollTo。
我不确定这是最好的方法,但这就是我想出来的。如果有人有任何其他建议,请随意!
答案 0 :(得分:1)
不是值得在所有面板中实施onTouchEvent(MotionEvent me)吗?滚动其中一个面板时,将调用此方法,并确保所有其他面板保持同步。
答案 1 :(得分:1)
处理触摸事件不起作用100%。不同视图中的滚动量可能不会始终同步。
答案 2 :(得分:1)
处理触摸事件是不够的,因为如果你进行快速晃动,滚动会在释放触摸后持续一段时间。解决方案是覆盖computeScroll()方法。看看https://github.com/chrisjenx/ParallaxScrollView如何在那里完成。
答案 3 :(得分:0)
您可以查看此帖:Link
这个人实际上在做什么他创建自定义ScrollViews并覆盖方法onScrollChanged
,添加一个监听器,然后在之前将它们同步,然后将它们绘制到屏幕上。
您现在可以做的是在ScrollView
中添加HorizontalScrollView
作为主框架。左侧栏为HorizontalScrollView
,顶栏为ScrollView
。然后,您将主ScrollView
和主HorizontalScrollView
注册为两个单独的ScrollManagers
(请参阅上面的链接)。
然后禁用hsv和sv的滚动并将它们添加到相应的ScrollManagers
。然后一切都应该正常。
-
PS。
如果您只使用听众本身而不是ScrollManager
,则会有1帧的同步延迟。
答案 4 :(得分:0)
我通过以下方式实现了相同的布局。
您会发现xml中的SyncedScrollView是用于同步两个滚动视图的自定义scrollview。
您需要在下面引用两个stackoverflow答案。
检查下面的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。所以你可以设置背景drawable来绘制框(它看起来像表)
您还可以动态添加左侧标题,顶部标题和正文TextView以动态创建表格。
抱歉我的纯英语。