如何在不阻止滚动的情况下禁用滚动视图上的滚动

时间:2014-07-11 10:33:44

标签: android user-interface scrollview

我正在研究android上的应用程序,它使用顶部滚动视图,内容和底部滚动视图模拟视差滚动。

我想仅使用中间滚动视图滚动,但我可以手动独立滚动顶视图。我想阻止这一点。

我从另一个相关的问题尝试了这个,但这似乎在这种情况下禁用滚动..我想要的是触摸落到第二层并为此处理滚动。

.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { return true; } });

这是onInterceptTouchEvent的电话吗?我仍在努力理解这一点。 如果这些信息不充分或者不清楚,请告诉我。

tl; dr - 我希望我的滚动视图完全被动接触,就像它不存在一样,并将触摸传递给较低层。

2 个答案:

答案 0 :(得分:1)

这只是一个想法,我没有测试过,但我认为以下步骤应该有效:

1.在您的顶部scrollView上,拦截onTouch事件(监视器尤其是ACTION_MOVE事件);

2.拿一个你想要移动的滚动视图的句柄。并使用ScrollView.smoothScrollto(int x,int y)函数以编程方式移动该scrollView.Pass在此motionEvent中收到的getX()和getY()值,从而允许您将触摸传递给较低层。

为了清楚起见,请参阅smoothScrollto的android文档。

3.显然,作为最后一个注意事项,你应该吞下你将以编程方式移动的下部scrollView上的触摸。这将避免下部scrollView在其自己的onTouch上移动。

由于您说要实现视差,您可以将步骤#2中收到的x和y值乘以某个因子,从而产生视差效果。

您可以在SO上轻松找到上述步骤的代码段。祝你好运!

编辑:如果您想在最上面的scrollView滚动时获取onScroll事件,请参阅this链接。

答案 1 :(得分:0)

我的解决方案受到@Parvaz Bhaskar解决方案的启发,但更简单......确实如此简单以至于当我想到我的问题时,我并没有感到惊讶

要将触摸传递到下面的图层......我只是将触摸传递到下面的图层

grassView.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View view, MotionEvent motionEvent) {
           mViewPager.onTouchEvent(motionEvent); //Scroll the view pager so that scrolling works through the grass.
           return true; // NO SCROLLING FOR YOU!  http://stackoverflow.com/a/10481239/1520364
       }
 });

在我的情况下,我在顶部有一个层grassView,这里有一个视图寻呼机,下面有一个需要滚动的实际标签。所以我吞下了草地上的触摸,并将它传递给我的ViewPager