Question

I'm implementing a onFling detector much like the following question: Fling gesture detection on grid layout

However, I just cannot get it to work.

In case some way I've set up my app is causing this issue (maybe the asynctask?), here's how my app is structured:

(Tried to make this a nicely formatted list, but it screwed up the code below it for some reason?)

--MapActivity creates a MapView.

--MapView creates an ASyncTask to fetch XML from a URL.

--onPostExecute() of the ASyncTask parses the XML and adds an ItemizedOverlay using the data fetched

--onTap() function of the ItemizedOverlay fetches an image from the web using LoaderImageView (http://www.anddev.org/novice-tutorials-f8/imageview-with-loading-spinner-t49439.html)

--onTap() function then calls the show() function of the PopupPanel class listed below

As you can see from the code below, the commented out lines work. However, the onTouch and onFling events are never hit when used with the MyGestureDetector class.

class PopupPanel {
    View popup;
    boolean isVisible = false;
    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    private GestureDetector gestureDetector;
    public View.OnTouchListener gestureListener;

    PopupPanel(Context context, int layout) {
        ViewGroup parent = (ViewGroup) map.getParent();

        popup = ((MapActivity) context).getLayoutInflater().inflate(layout, parent, false);

        SelectFilterActivity selectFilterActivity = new SelectFilterActivity();
        popup.setOnClickListener(selectFilterActivity);

// This works!
//            popup.setOnTouchListener(new View.OnTouchListener() {
//                public boolean onTouch(View v, MotionEvent event) {
//                    Toast.makeText(map.getContext(), "Touched", Toast.LENGTH_SHORT).show();
//                    return false;
//                }
//            });

        // Gesture detection
        gestureDetector = new GestureDetector(new MyGestureDetector());
        gestureListener = new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                if (gestureDetector.onTouchEvent(event)) {
                    return true;
                }
                return false;
            }
        };
    }

    class MyGestureDetector extends SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
                // right to left swipe
                if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Toast.makeText(map.getContext(), "Left Swipe", Toast.LENGTH_SHORT).show();
                }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Toast.makeText(map.getContext(), "Right Swipe", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                // nothing
            }
            return false;
        }

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }
    }

    View getView() {
        return (popup);
    }

    void show(boolean alignTop) {
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);

        if (alignTop) {
            lp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
            lp.setMargins(0, 20, 0, 0);
        } else {
            lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
            lp.setMargins(0, 0, 0, 60);
        }

        hide();

        ((ViewGroup) map.getParent()).addView(popup, lp);
        isVisible = true;
    }

    void hide() {
        if (isVisible) {
            isVisible = false;
            ((ViewGroup) popup.getParent()).removeView(popup);
        }
    }
}
Was it helpful?

Solution

I'm not 100% sure if this is the reason, but I didn't see call to View.setOnTouchListener in your code for gestureListener. I would've expected line;

setOnTouchListener(gestureListener)

After you've created it.

OTHER TIPS

Try returning true from your MyGestureDetector.onDown. The superclass implementation is to return false which then suppresses the delivery of future events until the touch is released.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top