SwipeRefreshLayout和Vertical ViewPager Touch问题

时间:2016-12-24 14:14:36

标签: android android-viewpager gesture ontouchlistener swiperefreshlayout

我有一个自定义SwipeRefreshLayout的Activity和一个垂直滑动的Vertical ViewPager。 (基本上是一副卡片,可以通过刷卡刷新来引用)。

所以现在,当我尝试滑动垂直Viewpager SwipeRefreshLayout处理触摸事件并刷新布局时,视图寻呼机的页面不会移动。

我尝试了两件事,但没有运气:

  1. 仅当用户从中启动时才启用滑动以刷新布局 工具栏。 MotionEvent.ACTION_DOWN事件getY()给出了工具栏的y 坐标。

  2. 如果ViewPager是第一个接受触摸事件的话,那么就是 不要将其委托给SwipeRefreshLayout

  3. 活动的布局文件如下所示。

    <android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:HelveticaTextView="http://schemas.android.com/apk/res-auto"
    xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:fab="http://schemas.android.com/apk/res-auto"
    android:id="@+id/DrawerLayout" android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    
    <com.CustomSwipeToRefresh xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/swipe_container" android:layout_width="match_parent"
        android:layout_height="100dp" app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
        <android.support.design.widget.CoordinatorLayout
            android:id="@+id/coordinatorLayout" android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/tool_bar" android:layout_width="match_parent"
                android:layout_height="@dimen/toolbar_min_height"
                android:background="@color/theme_color_yellow_dark"
                app:layout_collapseMode="pin"
                app:layout_scrollFlags="scroll|enterAlways" app:titleTextColor="@color/white">
    
            </android.support.v7.widget.Toolbar>
    
    
            <RelativeLayout android:layout_width="match_parent"
                android:layout_height="match_parent" android:layout_marginBottom="@dimen/toolbar_min_height"
                android:layout_marginTop="@dimen/toolbar_min_height"
                android:background="@color/transparent">
    
                <com.VerticalViewPager 
                    android:id="@+id/pagerhome"
                    android:layout_width="match_parent" 
                    android:layout_height="match_parent" />
    
            </RelativeLayout>
    
        </android.support.design.widget.CoordinatorLayout>
    
    </com.CustomSwipeToRefresh>
    
    <!-- to show nav drawer icons here -->
    <android.support.v7.widget.RecyclerView
        android:id="@+id/RecyclerView" android:layout_width="320dp"
        android:layout_height="match_parent" android:layout_gravity="left"
        android:background="#ffffff" android:scrollbars="vertical">
    
      </android.support.v7.widget.RecyclerView>
    
    
    </android.support.v4.widget.DrawerLayout>
    

    我的CustomSwipeToRefresh触摸拦截操作无法正常工作

     @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
    
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
    
                    mPrevY = MotionEvent.obtain(event).getY();
                    mDeclined = false; // New action
                    break;
    
                case MotionEvent.ACTION_MOVE:
    
    
                    final float eventY = event.getY();
                    float yDiff = Math.abs(eventY - mPrevY);
    
                    //disable swipe to refresh if user touches below 100px or dp
                    if (mDeclined || mPrevY > 100  ) {
                        mDeclined = true; 
                        return false;
                    }
            }
    
            return super.onInterceptTouchEvent(event);
        }
    

2 个答案:

答案 0 :(得分:1)

以下逻辑对我有用

当用户开始从工具栏中拖动时,启用滑动以刷新布局。 即,如果用户尝试从顶部滑动并且它包含工具栏,则仅启用滑动,如果用户触摸在工具栏位置后启动,则禁用滑动enter image description here

@Override
    public boolean onInterceptTouchEvent(MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mPrevY = MotionEvent.obtain(event).getY();
                mDeclined = false; 

                if (mPrevY > getResources().getDimensionPixelSize(R.dimen.disable_swipe_after) ) {
                    mDeclined = true; 
                }
                Log.d("Declined", mDeclined + "--" + mPrevY);

                break;

            case MotionEvent.ACTION_MOVE:

                if (mDeclined) {
                    return false;
                }
        }
        return super.onInterceptTouchEvent(event);
    }

答案 1 :(得分:-1)

mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        Log.e("onPageScrolled position(=",String.valueOf(position));
        Log.e("onPageScrolled positionOffset(=",String.valueOf(positionOffset));
        Log.e("onPageScrolled positionOffsetPixels(=",String.valueOf(positionOffsetPixels));
    }

    @Override
    public void onPageSelected(int position) {
        Log.e("onPageSelected position(=",String.valueOf(position));
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        Log.e("onPageScrollStateChanged state(=",String.valueOf(state));
        if(state==1) {
            swipeRefreshLayout.setEnabled(false);
        } else {
           swipeRefreshLayout.setEnabled(true);
        }
    }
});