android-Ultra-Pull-To-Refresh icon indicating copy to clipboard operation
android-Ultra-Pull-To-Refresh copied to clipboard

需要支持右滑的同志,请看这里,有解决方案

Open xujunhe opened this issue 7 years ago • 12 comments

继承 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);
}

}`

xujunhe avatar Dec 23 '16 01:12 xujunhe

三星c9000,PtrFrameLayout 嵌套viewpager,遇到了难以水平滑动的问题,用你的代码解决了,多谢了。

TangCheng-521 avatar Feb 16 '17 12:02 TangCheng-521

@xujunhe 采用你的代码后,还需要设置 mPtrFrame.disableWhenHorizontalMove(true); 解决了banner水平滑动的问题。

Leeeyou avatar Mar 24 '17 02:03 Leeeyou

@LeeeYou good ,It worked

XXiaoQing avatar Mar 28 '17 10:03 XXiaoQing

谢谢提供,解决了我的问题

Fermaa avatar Apr 12 '17 08:04 Fermaa

一款阅读app左右滑动,费了老半天劲解决不了,用了你的。完美解决。。谢谢!

gzbbxu avatar Apr 12 '17 11:04 gzbbxu

完美解决!!!!谢谢。

EricMo avatar May 08 '17 12:05 EricMo

Chinese,hi. boy

1w1d avatar May 21 '17 08:05 1w1d

终于有好心人解决了。。。

dingbuoyi avatar Jun 05 '17 05:06 dingbuoyi

有作者或者管理员在吗?真应该把这个修复合并到主分支去,解决大问题了

dingbuoyi avatar Jun 05 '17 06:06 dingbuoyi

v1.0.11版本 PtrFrameLayout 嵌套 HorizontalScrollView 横向滑动冲突,用 UP 主方案解决问题!

jzyu avatar Jun 22 '17 01:06 jzyu

if(needHorizontalMove)return; final ViewConfiguration configuration = ViewConfiguration.get(getContext()); mTouchSlop = configuration.getScaledPagingTouchSlop(); if语句把mTouchSlop的赋值屏蔽了,在三星s7上容易误伤垂直下拉的刷新操作,把if判断去掉效果更好。

zzw3239 avatar Jul 10 '17 03:07 zzw3239

有管理员吗?把这个合并一下吧

iielse avatar Nov 09 '17 07:11 iielse