【问题标题】:Detect swipe gesture in fragment检测片段中的滑动手势
【发布时间】:2014-04-10 07:24:31
【问题描述】:

您好,我已经实现了Fragment,我想检测片段上的触摸事件。

但我无法检测到该事件,事实上,根本没有检测到任何事件。它在Activity 中运行良好,但不适用于片段。

以下是我的代码:

  public class Swipe_Fragment extends Fragment implements
    GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {

private SimpleGestureFilter detector;
private LinearLayout swipLinear;
private static int DEFAULT = 50;
private int brightness;
private GestureDetectorCompat mDetector;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.swipe_screen, container,
            false);
    swipLinear = (LinearLayout) rootView.findViewById(R.id.swipLinear);

    brightness = DEFAULT;
    mDetector = new GestureDetectorCompat(getActivity(), this);
    // Set the gesture detector as the double tap
    // listener.
    mDetector.setOnDoubleTapListener(this);
    // Detect touched area
    // detector = new SimpleGestureFilter(getActivity(), this);
    return rootView;
}


@Override
public boolean onDoubleTap(MotionEvent arg0) {
    Toast.makeText(getActivity(), "onDoubleTap", Toast.LENGTH_LONG).show();
    return false;
}

@Override
public boolean onDoubleTapEvent(MotionEvent e) {
    Toast.makeText(getActivity(), "onDoubleTapEvent", Toast.LENGTH_LONG).show();
    return false;
}

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    Toast.makeText(getActivity(), "onSingleTapConfirmed", Toast.LENGTH_LONG).show();
    return false;
}

@Override
public boolean onDown(MotionEvent e) {
    Toast.makeText(getActivity(), "onDown", Toast.LENGTH_LONG).show();
    return false;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
    Toast.makeText(getActivity(), "onFling", Toast.LENGTH_LONG).show();
    return false;
}

@Override
public void onLongPress(MotionEvent e) {
    Toast.makeText(getActivity(), "onLongPress", Toast.LENGTH_LONG).show();

}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
    Toast.makeText(getActivity(), "onScroll", Toast.LENGTH_LONG).show();
    return false;
}

@Override
public void onShowPress(MotionEvent e) {
    Toast.makeText(getActivity(), "onShowPress", Toast.LENGTH_LONG).show();

}

@Override
public boolean onSingleTapUp(MotionEvent e) {
    Toast.makeText(getActivity(), "onSingleTapUp", Toast.LENGTH_LONG).show();
    return false;
}

}

【问题讨论】:

    标签: android android-fragments gesture


    【解决方案1】:

    最后我从下面的代码中得到了一个解决方案,它来自Android Fragment onCreateView with Gestures

      final GestureDetector gesture = new GestureDetector(getActivity(),
        new GestureDetector.SimpleOnGestureListener() {
    
            @Override
            public boolean onDown(MotionEvent e) {
                return true;
            }
    
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
                Log.i(Constants.APP_TAG, "onFling has been called!");
                final int SWIPE_MIN_DISTANCE = 120;
                final int SWIPE_MAX_OFF_PATH = 250;
                final int SWIPE_THRESHOLD_VELOCITY = 200;
                try {
                    if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                        return false;
                    if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                        Log.i(Constants.APP_TAG, "Right to Left");
                    } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                        Log.i(Constants.APP_TAG, "Left to Right");
                    }
                } catch (Exception e) {
                    // nothing
                }
                return super.onFling(e1, e2, velocityX, velocityY);
            }
        });
    
    v.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return gesture.onTouchEvent(event);
        }
    });
    

    这在片段的onCreateView() 方法中。

    【讨论】:

    • 不应该进入onCreateView()方法吗?
    • 确实应该去那里@jos。我已经在那里尝试过这个解决方案,它奏效了!
    • 如果我们想上下滑动怎么办??
    • @NaumanKhalid 您必须在 onFling 方法中计算它是向上还是向下抛。我建议主要使用velocityY 值来执行此操作。如果velocityY非常低或velocityX也很大,我也建议忽略它,因为这将分别省略水平和对角线滑动。