android-Ultra-Pull-To-Refresh
android-Ultra-Pull-To-Refresh copied to clipboard
需要支持右滑的同志,请看这里,有解决方案
继承 PtrFrameLayout 项目中使用MPtrClassicFrameLayout 来代替PtrFrameLayout 记得调用disableWhenHorizontalMove();
亲测可行! 为了减少各位时间,提供代码
`/**
- 支持右滑的下拉刷新
- Created by xujunhe on 16-12-19. */
public class MPtrClassicFrameLayout extends PtrFrameLayout {
public MPtrClassicFrameLayout(Context context) {
super(context);
}
public MPtrClassicFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MPtrClassicFrameLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
private float startY;
private float startX;
// 记录viewPager是否拖拽的标记
private boolean mIsHorizontalMove;
// 记录事件是否已被分发
private boolean isDeal;
private boolean needHorizontalMove;
private int mTouchSlop;
@Override
public void disableWhenHorizontalMove(boolean disable) {
super.disableWhenHorizontalMove(disable);
this.needHorizontalMove = disable;
if(needHorizontalMove)return;
final ViewConfiguration configuration = ViewConfiguration.get(getContext());
mTouchSlop = configuration.getScaledPagingTouchSlop();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (!needHorizontalMove) return super.dispatchTouchEvent(ev);
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// 记录手指按下的位置
startY = ev.getY();
startX = ev.getX();
// 初始化标记
mIsHorizontalMove = false;
isDeal = false;
break;
case MotionEvent.ACTION_MOVE:
// 如果已经判断出是否由横向还是纵向处理,则跳出
if (isDeal) {
break;
}
/**拦截禁止交给Ptr的 dispatchTouchEvent处理**/
mIsHorizontalMove = true;
// 获取当前手指位置
float endY = ev.getY();
float endX = ev.getX();
float distanceX = Math.abs(endX - startX);
float distanceY = Math.abs(endY - startY);
if (distanceX != distanceY) {
// 如果X轴位移大于Y轴位移,那么将事件交给右滑控件处理。
if (distanceX > mTouchSlop && distanceX > distanceY) {
mIsHorizontalMove = true;
isDeal = true;
} else if (distanceY > mTouchSlop) {
mIsHorizontalMove = false;
isDeal = true;
}
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
//下拉刷新状态时如果滚动了右滑控件 此时mIsHorizontalMove为true 会导致PtrFrameLayout无法恢复原位
// 初始化标记,
mIsHorizontalMove = false;
isDeal = false;
break;
}
if (mIsHorizontalMove) {
return dispatchTouchEventSupper(ev);
}
return super.dispatchTouchEvent(ev);
}
}`
三星c9000,PtrFrameLayout 嵌套viewpager,遇到了难以水平滑动的问题,用你的代码解决了,多谢了。
@xujunhe 采用你的代码后,还需要设置 mPtrFrame.disableWhenHorizontalMove(true); 解决了banner水平滑动的问题。
@LeeeYou good ,It worked
谢谢提供,解决了我的问题
一款阅读app左右滑动,费了老半天劲解决不了,用了你的。完美解决。。谢谢!
完美解决!!!!谢谢。
Chinese,hi. boy
终于有好心人解决了。。。
有作者或者管理员在吗?真应该把这个修复合并到主分支去,解决大问题了
v1.0.11版本 PtrFrameLayout 嵌套 HorizontalScrollView 横向滑动冲突,用 UP 主方案解决问题!
if(needHorizontalMove)return; final ViewConfiguration configuration = ViewConfiguration.get(getContext()); mTouchSlop = configuration.getScaledPagingTouchSlop(); if语句把mTouchSlop的赋值屏蔽了,在三星s7上容易误伤垂直下拉的刷新操作,把if判断去掉效果更好。
有管理员吗?把这个合并一下吧