2017-10-28 44 views
0

我有一个布局由CoordinatorLayout母体的用含有ViewPager,其中包含一个NestedScrollView一个RecyclerViewCoordinatorLayout:如何防止滚动事件到达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(),但似乎并没有这样的伎俩。

回答

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滚动消耗的未消耗值的输出变量。

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元素的触摸的相对位置,然后回报
真正
告诉系统我想要消费此触摸事件,并且返回
让其他人处理触摸事件。

+0

嗯,这是一般的。有没有过滤滚动事件的解决方案? –

+0

好吧,我知道,它可能通过这个,但我想节省时间,如果有一个内置/较少涉及的方法可用,我怀疑可能有一个与CoordinatorLayout的所有流行 –

+0

我想我只知道这种方法,你能告诉我确切的条件或要求你想拦截触摸recyclerview我会尝试通过我的方法并排。 –

相关问题