SwipeRefreshLayout 和垂直 ViewPager 触摸问题
SwipeRefreshLayout and Vertical ViewPager Touch Issues
我有一个带有自定义 SwipeRefreshLayout 和垂直滑动的 Vertical ViewPager 的 Activity。 (基本上是一副纸牌,可以通过滑动刷新来参考)。
所以现在当我尝试滑动垂直时 Viewpager
SwipeRefreshLayout
处理触摸事件并刷新布局并且视图寻呼机的页面不会移动。
我尝试了两件事但没有成功:
仅当用户从
工具栏。 MotionEvent.ACTION_DOWN
事件 getY()
给出工具栏的 y
协调。
如果ViewPager
最先接受触摸事件则
不要委托给 SwipeRefreshLayout
.
activity 的布局文件如下所示。
<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);
}
下面的逻辑对我有用
当用户开始从工具栏拖动时启用滑动刷新布局。
即,如果用户尝试从最顶部滑动并且它包含工具栏,则仅启用滑动,如果用户触摸在工具栏位置之后开始,则禁用滑动
@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);
}
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);
}
}
});
我有一个带有自定义 SwipeRefreshLayout 和垂直滑动的 Vertical ViewPager 的 Activity。 (基本上是一副纸牌,可以通过滑动刷新来参考)。
所以现在当我尝试滑动垂直时 Viewpager
SwipeRefreshLayout
处理触摸事件并刷新布局并且视图寻呼机的页面不会移动。
我尝试了两件事但没有成功:
仅当用户从 工具栏。
MotionEvent.ACTION_DOWN
事件getY()
给出工具栏的 y 协调。如果
ViewPager
最先接受触摸事件则
不要委托给SwipeRefreshLayout
.
activity 的布局文件如下所示。
<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);
}
下面的逻辑对我有用
当用户开始从工具栏拖动时启用滑动刷新布局。
即,如果用户尝试从最顶部滑动并且它包含工具栏,则仅启用滑动,如果用户触摸在工具栏位置之后开始,则禁用滑动
@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);
}
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);
}
}
});