CoordinatorLayout:如何防止滚动事件到达RecyclerView?

时间:2017-10-28 21:03:52

标签: android android-coordinatorlayout

我的布局包含CoordinatorLayout父级,NestedScrollView包含ViewPager,其中包含RecyclerView

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.snap.MainActivity"
    tools:layout_editor_absoluteX="8dp"
    tools:layout_editor_absoluteY="8dp">

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/nested_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <android.support.constraint.ConstraintLayout
            android:id="@+id/scroll_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:id="@+id/linearLayout3"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:orientation="vertical"
                android:layout_gravity="top"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintLeft_toLeftOf="parent">

            </LinearLayout>

            </LinearLayout>

            <android.support.v4.view.ViewPager
                android:id="@+id/id_viewpager_photosvideos_albums"
                android:layout_width="match_parent"
                android:layout_height="1000dp"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/linearLayout1">

                <android.support.design.widget.TabLayout
                    android:id="@+id/id_tab_photosvideos_albums"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="top">

                    <android.support.design.widget.TabItem
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />

                    <android.support.design.widget.TabItem
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />

                </android.support.design.widget.TabLayout>


            </android.support.v4.view.ViewPager>


        </android.support.constraint.ConstraintLayout>

    </android.support.v4.widget.NestedScrollView>

    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

我想实现以下目标:

我希望拦截(阻止)滚动事件到达RecyclerView,直到达到某个阈值条件。帖子,RecyclerView将开始正常拦截滚动事件。

我怎样才能做到这一点?

注意:我试过调查Behavior.onNestedScroll(),但这似乎没有办法。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用此方法拦截UI元素上的触摸。

findViewById(R.id.recyclerView).setOnTouchListener(this)

然后覆盖 onTouch 方法。

 @Override
    public boolean onTouch(View view, MotionEvent motionEvent)
    {
        initialX = event.getX();
        initialY = event.getY();

        switch (motionEvent.getAction()){
            case MotionEvent.ACTION_UP:
               //
                break;
            case MotionEvent.ACTION_DOWN:
               //do something here 

                break;
        }
        return true;
    }

查看参数,您可以检查哪个视图触摸或滚动并获取屏幕上UI元素触摸的相对位置,然后返回<登记/> 是告诉系统我要使用此触摸事件并返回
false
让其他人处理触摸事件。

答案 1 :(得分:0)

终于找到了答案 -

通过这样消费它们(在CoordinatorLayout.Behavior中):

@Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, NestedScrollView child, View directTargetChild, View target, int nestedScrollAxes) {
        return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, NestedScrollView child, View target, int dx, int dy, int[] consumed) {

        int mCurrentScrollOffset = target.getScrollY();

        if(mCurrentScrollOffset <= thresholdScrollDistance){
            consumed[1] = dy;
            child.scrollBy(0, dy);
        }
    }

<强>为什么吗

因为,consumed[i]是一个存储x和y的输出变量,滚动未消耗的值以供消费。