安卓中GestureDetector手势与listview的item点击发生冲突(重合)[复制链接]

我用MyGestureListener提供的SimpleOnGestureListener写了一个简单的activity左右滑动的手势

但是在测试过程中发现,在activity左右滑动时,如果手指按下的点在listview的item上,有可能会同时触发滑动和item的点击事件

想实现的效果是:滑动的同时,即使down点在item上,也不会触发点击事件

代码放在下面

1.MyGestureListener的手势代码:

private class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float v, float v1) {
            //左右滑动判定
            if (e1.getX() - e2.getX() > MIN_MOVE) {    
                //左滑动
            }
            else if (e2.getX() - e1.getX() > MIN_MOVE) {
                //右滑动
            }
            return true;
        }
    }

2.重写的activity的onTouchEvent方法

代码如下:

@Override
    public boolean onTouchEvent(MotionEvent event) {
        mDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    } 

3.重写的lisitview的setOnTouchListener方法

mlView.setOnTouchListener(new View.OnTouchListener() {
            //重写setOnTouchListener方法,避免listview与GestureDetector冲突
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                getActivity().onTouchEvent(event);
                return false;
            }
        });

后来我尝试重写了activity的dispatchTouchEvent方法

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    this.mDetector.onTouchEvent(ev);
    return super.dispatchTouchEvent(ev);

也没有得到相要的结果

1176109313 424查看 · 1回复 · 2019-4-5 11:08 有用(0
共1个回答
禁卫军 2019-4-8 10:10 回复

View.OnTouchListener onTouchListener=new View.OnTouchListener() {

@Override
 public boolean onTouch(View v, MotionEvent event) {
    if(isls){
        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:
                mPosX = event.getX();
                mPosY = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                mCurPosX = event.getX();
                mCurPosY = event.getY();

                break;
            case MotionEvent.ACTION_UP:
                if (mCurPosX - mPosX > 0
                        && (Math.abs(mCurPosX - mPosX) > 25)&&(Math.abs(mCurPosY-mPosY)<40)) {
                    //左向右 
                } else if (mCurPosX - mPosX < 0
                        && (Math.abs(mCurPosX - mPosX) > 25)&&(Math.abs(mCurPosY-mPosY)<40)) {
                    //向右滑动}
                }
                break;
        }
    }
    return false;
}

};

View.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                System.out.println("click");
            }
        });
                    
                    
                这样好像可以
需要登入后才可以评论 登录 | 立即注册