Can';在Android中无法检测框架布局上的手势

Can';在Android中无法检测框架布局上的手势,android,gesture,Android,Gesture,我想在android中实现一个全局导航栏小部件,扩展FrameLayout,这样它就可以在布局xml中声明,而不是包含在每个活动中 导航栏有三个组件:徽标、标题和按钮 当触摸或按下导航栏(不包括按钮)时,我会显示一些东西。但现在我的onFling手势无法被检测到(onFling in swipgesturelistener已经过测试),任何人都可以帮助我 类导航栏: public class NavigationBarWidget extends FrameLayout implements V

我想在android中实现一个全局导航栏小部件,扩展FrameLayout,这样它就可以在布局xml中声明,而不是包含在每个活动中

导航栏有三个组件:徽标、标题和按钮 当触摸或按下导航栏(不包括按钮)时,我会显示一些东西。但现在我的onFling手势无法被检测到(onFling in swipgesturelistener已经过测试),任何人都可以帮助我

类导航栏:

public class NavigationBarWidget extends FrameLayout implements View.OnClickListener

private SwipeGestureListener mSwipeListener = new SwipeGestureListener();
private GestureDetector mGestureDetector;
NavigationBarWidget():

OnClick():

SwipeGestureListener中的onFling():

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    Log.v("Nav", "onFling");
    try {
        if (Math.abs(e1.getX() - e2.getX()) > SWIPE_MAX_OFF_PATH)
        {
            return false;
        }
        else
        {
            if ((e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityY) >   SWIPE_THRESHOLD_VELOCITY)) {
                this.mCallbackListener.onFlingDown();
                return true;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

Logcat:当触摸或向下弹出导航栏时,“onTouch”被输出,但没有检测到弹出的手势。

我自己通过阅读Android开发者博客上的一篇文章解决了这个问题:

解决方案是让手势检测器处理手势,您可以这样处理触摸事件:

    mGestureDetector = new GestureDetector(mSwipeListener);

    this.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.v("Nav", "onTouch");

            mGestureDetector.onTouchEvent(event);
            final int action = event.getAction();

            switch (action) {
                case MotionEvent.ACTION_DOWN:{
                    Log.v("Nav", "onDown");
                    break;
                }
                case MotionEvent.ACTION_UP:{
                    Log.v("Nav", "onUp");
                    break;
                }
            }

            return true;
        }
    });
当我在NavigationBarWidget上扔下时,日志将是: onTouch->onDown->onTouch(多少onTouch直到您在屏幕上按多长时间)->onFlingDown->onUp

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    Log.v("Nav", "onFling");
    try {
        if (Math.abs(e1.getX() - e2.getX()) > SWIPE_MAX_OFF_PATH)
        {
            return false;
        }
        else
        {
            if ((e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityY) >   SWIPE_THRESHOLD_VELOCITY)) {
                this.mCallbackListener.onFlingDown();
                return true;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}
    mGestureDetector = new GestureDetector(mSwipeListener);

    this.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.v("Nav", "onTouch");

            mGestureDetector.onTouchEvent(event);
            final int action = event.getAction();

            switch (action) {
                case MotionEvent.ACTION_DOWN:{
                    Log.v("Nav", "onDown");
                    break;
                }
                case MotionEvent.ACTION_UP:{
                    Log.v("Nav", "onUp");
                    break;
                }
            }

            return true;
        }
    });