禁用 ScrollView 操作

Posted

技术标签:

【中文标题】禁用 ScrollView 操作【英文标题】:Disable ScrollView action 【发布时间】:2011-01-14 19:26:56 【问题描述】:

在我的应用程序中,我有一条线用于增加小部件的宽度(通过向右/向左拖动线),并且我在同一个活动中启用了ScrollView。我需要在用户触摸线时禁用滚动视图操作,当用户释放时,它应该被启用。 ScrollView 应处于可见状态,但应禁用滚动视图的操作。请帮我解决这个问题。我已经尝试过这些,但它们都不起作用。

scroll.setEnabled(false); 
scroll.setFocusable(false); 
scroll.setHorizontalScrollBarEnabled(false); 
scroll.setVerticalScrollBarEnabled(false);

提前致谢。

【问题讨论】:

【参考方案1】:

这可能有点晚了,但我遇到了同样的问题,所以我的解决方案与上面类似,必须禁用 OnTouchListener,如下所示:

// Get the ScrollView
final ScrollView myScroll = (ScrollView) findViewById(R.id.display_scrollview);


// Disable Scrolling by setting up an OnTouchListener to do nothing
myScroll.setOnTouchListener( new OnTouchListener() 
    @Override
    public boolean onTouch(View v, MotionEvent event) 
        return true; 
    
);


// Enable Scrolling by removing the OnTouchListner
tvDisplayScroll.setOnTouchListener(null);    

【讨论】:

【参考方案2】:

这有点晚了,但更简单的方法是让您的父母@987654321@ 并致电requestDisallowInterceptTouchEvent(true)。这不仅会导致直接父对象(滚动视图),而且会导致任何其他可能拦截触摸的父对象在特定事件期间忽略它。当您有一个可拖动的子级和可拖动的父级时,这非常有用,并且希望在拖动子级时禁用父级拖动。

这也是一个比专门禁用滚动视图更通用的解决方案。如果您在其他地方重新使用您的可拖动子视图,它仍然可以工作:您不需要知道滚动视图的 ID。无需修改即可重复使用的代码总是好的。

【讨论】:

太棒了。您可以通过 getParent().requestDisallowInterceptTouchEvent(...) 在视图中使用它。我在 ScrollView 内的水平滚动图库中使用了它,效果很好! 奇怪的是,我有一个滚动视图->线性布局->我的新控件,发现我必须实际选择滚动视图才能调用此 requestDisallowInterceptTouchEvent(true),然后才能停止滚动。我认为文档说它会将这条消息向上发送给所有父母,但这对我不起作用。 这不会导致 ScrollView 的子级也无法获得触摸事件吗? 这个解决方案为我节省了一天的时间。太棒了! @***ed,是的,但它仅适用于特定手势的持续时间,因此只要抬起手指,它就会恢复正常行为。想法是,当一个手势开始时,不清楚该手势将属于哪个视图,所以他们都处理它;一旦变得清晰,这一系列运动事件就会被一个视图捕获,但仅限于手势的持续时间,而其他视图会获得运动取消事件。 requestDisallowInterceptTouchEvent() 基本上让子视图告诉父视图“这个手势是给我的,忽略它的其余部分......”【参考方案3】:

如果有人使用 android L 或更高版本并且覆盖 onTouchonInterceptTouchEvent 不起作用: 尝试覆盖onStartNestedScrollreturn false

还有一个新的 XML 属性 nestedScrollingEnabled,但它似乎必须在 正在泄漏的 View 上滚动事件,而不是在受泄漏影响的 ScrollView 上,或它们之间的布局层次结构中的任何位置。因此,如果您事先不知道您可能拥有哪些子 ScrollView,则可以为受影响的 ScrollView 覆盖 onStartNestedScroll

【讨论】:

以上是关于禁用 ScrollView 操作的主要内容,如果未能解决你的问题,请参考以下文章

iOS UIScrollView 无法滚动 没有弹簧效果解决方案

如何使用 AutoLayout (iOS/Xamarin.iOS) 使 ScrollView 适合其内容?

Android:ScrollView 与 NestedScrollView

如何在 ScrollView 中居中 UIImageView(缩放)

渐进式滚动子scrollView

是否可以使用 ScrollView 和 Horizo​​ntalScrollView 实现对角滚动?