TypechoJoeTheme

香草物语

统计
登录
用户名
密码
/
注册
用户名
邮箱
输入密码
确认密码

SwipeMenuListView在ScrollView里上下滑动导致菜单不能显示完全的bug解决方法

Laughing博主
2020-12-07
/
0 评论
/
1,100 阅读
/
152 个字
/
百度已收录
12/07
本文最后更新于2020年12月07日,已超过1382天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

public class NoRollSwipeMenuListView extends SwipeMenuListView {

private GestureDetector mGestureDetector;

public NoRollSwipeMenuListView(Context context) {
    super(context);
    mGestureDetector = new GestureDetector(context, onGestureListener);
}

public NoRollSwipeMenuListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mGestureDetector = new GestureDetector(context, onGestureListener);
}

public NoRollSwipeMenuListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    mGestureDetector = new GestureDetector(context, onGestureListener);
}

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, expandSpec);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    boolean b = mGestureDetector.onTouchEvent(ev);

// LogUtil.w("onTouchEvent", "mGestureDetector.onTouchEvent(ev)->" + b);

    return super.onTouchEvent(ev);
}

private GestureDetector.OnGestureListener onGestureListener = new GestureDetector.SimpleOnGestureListener() {

    //distanceX 左右滑动距离,左滑动正值,右滑动负值
    //distanceY 上下滑动距离,上滑动正值,下滑动负值
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        if (Math.abs(distanceY) >= Math.abs(distanceX)) {//上下滑动距离大于左右滑动距离,当作上下滑动

// LogUtil.w("onScroll", "distanceX=" + distanceX + ":distanceY=" + distanceY);
// LogUtil.w("onScroll", "true");

            //上下滑动不做任何操作,在这里父ScrollView已经交出onTouch权限,否则如果权限在父ScrollView的话这里接收不到事件
            //所以执行到这里是因为下面的setParentScrollAble(false);已经执行过了
            return true;
        }
        //当滑动NoRollSwipeMenuListView的时候,让父ScrollView交出onTouch权限,也就是让父ScrollView停住不能滚动
        setParentScrollAble(false);

// LogUtil.w("onScroll", "false");

        return false;
    }
};

/**
 * 是否把滚动事件交给父ScrollView
 *
 * @param flag
 */
private void setParentScrollAble(boolean flag) {
    //这里的parentScrollView就是NoRollSwipeMenuListView外面的那个ScrollView

// LogUtil.w("setParentScrollAble", "flag->" + flag);

    getParent().requestDisallowInterceptTouchEvent(!flag);
}

}

朗读
赞(1)
赞赏
感谢您的支持,我会继续努力哒!
评论 (0)
  1. evil 闲逛
    MacOS · Safari

      谢谢分享

    2018-06-05 回复