垂直ViewPager2内部的垂直ScrollView无法正常工作

时间:2020-11-01 23:49:31

标签: android scroll android-viewpager scrollview vertical-scrolling

我有一个基本的ViewPager2垂直方向,由2个Fragments组成。

Fragment 2内,我有一个垂直的ScrollView

两个垂直滚动都存在冲突,并且无法正常工作。我知道有很多类似的问题,但是我发现并尝试的所有方法都失败了。

我正在寻找一种可以处理两个触摸事件的解决方案。

任何代码示例或致谢

1 个答案:

答案 0 :(得分:1)

我终于通过编写自定义滚动视图来处理两个垂直滚动来解决问题:

public class CustomScrollView extends NestedScrollView {

    public CustomScrollView(@NonNull Context context) {
        super(context);
    }
    public CustomScrollView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public CustomScrollView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    float startY, dy;

    @Override
    protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
        if (scrollY > 15) { // 10 - 15 -> avoid fake mouv
            viewPager2.setUserInputEnabled(false);
        }
        else {
            viewPager2.setUserInputEnabled(true);
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
                startY = ev.getRawY();
        }
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                startY = ev.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                dy = ev.getRawY() - startY;
                if (dy > -5 && dy < 70) { // range tested on 5 devices but can be modified
                    return false;
                }
                else {
                    viewPager2.setUserInputEnabled(false);
                }
                break;
        }
        return super.onTouchEvent(ev);
    }
}