【问题标题】:Disable Android scrollview, but still allow taps on buttons in the scroll view禁用 Android 滚动视图,但仍允许点击滚动视图中的按钮
【发布时间】:2013-11-11 01:57:15
【问题描述】:

我希望能够阻止用户在我的 Android ScrollView 中滚动,但仍能检测到他们何时点击滚动视图中的按钮。

我对 ScrollView 类进行了子类化,并且一直在摆弄onInterceptTouchEventonTouchEvent 方法,但似乎无法完全正确。下面的代码停止滚动,但似乎禁用了点击(但不是全部,就像如果你没有任何移动就上下移动它可以工作,但如果你的手指在你点击时轻微移动它不会注册)。我也刚刚删除了onInterceptTouchEvent,它几乎可以正常工作,但是当用户移开手指时,滚动视图仍然会滚动。

@覆盖 公共布尔 onInterceptTouchEvent(MotionEvent ev) { App.log("onInterceptTouchEvent, with action : " + ev.getAction()); 开关(ev.getAction()) { 案例 MotionEvent.ACTION_MOVE: 返回真; } 返回 super.onInterceptTouchEvent(ev); } @覆盖 公共布尔 onTouchEvent(MotionEvent ev) { App.log("onTouchEvent, 带有动作:" + ev.getAction()); 开关(ev.getAction()) { 案例 MotionEvent.ACTION_MOVE: 返回假; } 返回 super.onTouchEvent(ev); }

【问题讨论】:

    标签: android scrollview touch-event


    【解决方案1】:

    最后,我发现以下解决方案完全符合我的需要:

    @Override
    public boolean onTouchEvent(MotionEvent ev)
    {
        App.log("onTouchEvent, with action : " + ev.getAction());
        switch(ev.getAction())
        {
            case MotionEvent.ACTION_MOVE:
                return false;
        }
        return super.onTouchEvent(ev);
    }
    

    【讨论】:

      【解决方案2】:

      如果禁用,您可以覆盖 overscrollBy() 并将 deltaX 和 deltaY 值更改为 0。

      @Override
      protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent)
      {
          final int dx;
          final int dy;
      
          if (isEnabled())
          {
              dx = deltaX;
              dy = deltaY;
          }
          else
          {
              dx = 0;
              dy = 0;
          }
      
          return super.overScrollBy(dx, dy, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
      }
      

      您可能还想在禁用/启用时动态隐藏/显示滚动条。

      【讨论】:

      • 嗯...似乎不是正确的答案,肯定有一种方法可以在开始时停止滚动而不必担心这种“过度滚动”业务(我不能只是禁用过度-还是用setOverScrollMode滚动?)
      • ScrollView 使用该方法执行其滚动。诚然,这不是一个完美的解决方案,但在ScrollView 的界面上没有特定的allowScrolling(boolean) 或类似的东西来执行您想要的操作,我认为它与任何其他方法一样好。
      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多