【问题标题】:how to disable scrolling of HorizontalScrollView inside the ViewPager如何在 ViewPager 中禁用 Horizo​​ntalScrollView 的滚动
【发布时间】:2014-05-27 12:51:09
【问题描述】:

我在 ViewPager 中放置了一个水平滚动视图。目标是仅使用软件触发的水平滚动视图滚动。所有滚动手势都应由视图寻呼机处理。

我已经通过创建一个拦截所有滑动手势的自定义 View Pager 来做到这一点:

public class GreedyViewPager extends ViewPager {

    GestureDetector mGestureDetector;
    View.OnTouchListener mGestureListener;

    public GreedyViewPager(Context context) {
        super(context);
        initGestureDetector(context);
    }

    public GreedyViewPager(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        initGestureDetector(context);
    }

    void initGestureDetector(Context context){
        mGestureDetector = new GestureDetector(context, new ScrollDetector());
        ViewConfiguration vc = ViewConfiguration.get(context);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev) || mGestureDetector.onTouchEvent(ev);
    }

    class ScrollDetector extends SimpleOnGestureListener {
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            return true;
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            return true;
        }
    }
}

不幸的是,它不适用于所有设备,有时我必须滑动几次才能转到 ViewPager 中的下一个位置。

知道如何让它变得更好吗?

【问题讨论】:

标签: android android-layout android-viewpager android-view


【解决方案1】:

为了解决这个问题,我遵循了以下步骤:

首先我创建了一个自定义的 Horizo​​ntalScrollView 类:

public class MyScrollView extends HorizontalScrollView{

    public MyScrollView(Context context) {
        super(context);

    }
    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

    @Override
    protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX,boolean clampedY) {    

        Log.e(" horizontal ", " - "+scrollX);
            // here i call the listener i have created
        scrollViewListener.onHorizontalScrollChanged(scrollX, scrollY);

        super.onOverScrolled(0, scrollY, true, true);       
    }

    // i create a scroll view listener, and i instantiate this from main Activity
    private ScrollViewListener scrollViewListener = null;   
    public interface ScrollViewListener {
        void onHorizontalScrollChanged(int x, int y);
    }

    public void setScrollViewListener(ScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);    
    }

}

在你的 MainActivity 中实现这个:

implements MyScrollView.ScrollViewListener

@Override
public void onHorizontalScrollChanged(int x, int y) {
      // In your ViewPager call this method
      mPager.scrollBy(x, y);
}

同样在 onCreate 的 MainActivity 中你必须添加这个:

// i have also added this custom HorizontalScrollView to my XML
MyScrollView myScrollView = (MyScrollView) findViewById(R.id.h_scroll);
myScrollView.setScrollViewListener(this);

我实现了这段代码,它对我有用,我希望它甚至对你也有用:)

【讨论】:

    【解决方案2】:

    您需要创建一个自定义 ScrollView 并覆盖 onInterceptTouchEvent 并从中返回 false。

    public class StoppableScrollView extends ScrollView {
    
      public StoppableScrollView(Context context) {
        super(context);
      }
    
    
      @Override
      public boolean onInterceptTouchEvent(MotionEvent ev) {
        return false;
      }
    

    }

    【讨论】:

    • 我已经试过了。它可以工作,但是 Horizo​​ntalScrollView 内的项目不可点击。我只需要拦截滚动事件。
    【解决方案3】:

    这是你需要的吗?

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev){
       if(ev.getAction()==MotionEvent.ACTION_MOVE)
          return true;
       return super.dispatchTouchEvent(ev);
    }
    

    【讨论】:

    • 不是那么容易,滚动事件由Action_DOWN、Action_MOVE和Action_UP组成。有时甚至会有不同的配置,例如在第二次单击后立即双击和滚动时。
    【解决方案4】:

    尝试设置viewpager的DescendantFocusability。

     viewPager.setDescendantFocusability(ViewPager.FOCUS_BEFORE_DESCENDANTS);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多