2016-11-13 56 views
0

我有一个NestedScrollView之上的RelativeLayout。我想阻止任何对RelativeLayout的点击传播,但允许所有的滚动事件。 应适用于RelativeLayout的与“controllers_container” ID如何防止点击事件和绕过视图上的滚动事件?

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

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

     ... content ... 

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

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_anchor="@id/scrollView" 
     app:layout_anchorGravity="bottom|left|end"> 

     <RelativeLayout 
      android:id="@+id/controllers_container" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:padding="@dimen/activity_vertical_margin" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:layout_above="@+id/bottom_bar"> 

      ... content ... 

     </RelativeLayout> 

     ... content ... 

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

添加android:clickable="true"防止任何触摸事件,包括滚动。我试图设置一个触摸侦听器的scrollView,但不能按需要管理它。有任何想法吗?

+0

尝试将触摸事件切换到父级布局,并使用onTouchIntercept进行处理 – Vicky

回答

0

我想出了一个办法。 基本上,我在NestedScrollView中处理触摸事件(称为targetView)。我创建处理该触摸事件时,一个这样的公共方法:

public boolean handleTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_UP) { 

      ... Handle the action up event ... 

     } 
     return true; 
    } 

然后,我设置在父该视图的触摸监听器(在这种情况下,包含所有这些元素的片段)。如果行动发生在控制器容器之外,我打电话给handleTouch方法。

targetView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_UP) { 
        int scrollY = nestedScrollView.getScrollY(); 
        int top = controllersContainer.getTop(); 
        float y = event.getY() + targetView.getTop(); 
        if (y - scrollY > top) { 
         return false; 
        } 
       } 
       return targetView.handleTouch(v, event); 
      } 
     }); 
相关问题