Pregunta

Estoy implementando un detector onFling muy parecido a la siguiente pregunta:Detección de gestos de lanzamiento en diseño de cuadrícula

Sin embargo, simplemente no puedo hacerlo funcionar.

En caso de que alguna forma en la que configuré mi aplicación esté causando este problema (¿tal vez la asynctask?), así es como está estructurada mi aplicación:

(¿Intentó hacer de esta una lista bien formateada, pero arruinó el código debajo por alguna razón?)

--MapActivity crea un MapView.

--MapView crea una ASyncTask para recuperar XML de una URL.

--onPostExecute() de ASyncTask analiza el XML y agrega un ItemizedOverlay usando los datos obtenidos

La función --onTap() de ItemizedOverlay recupera una imagen de la web usando LoaderImageView (http://www.anddev.org/novice-tutorials-f8/imageview-with-loading-spinner-t49439.html)

La función --onTap() luego llama a la función show() de la clase PopupPanel que se enumera a continuación

Como puede ver en el código siguiente, las líneas comentadas funcionan.Sin embargo, los eventos onTouch y onFling nunca se activan cuando se usan con la clase MyGestureDetector.

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);
        }
    }
}
¿Fue útil?

Solución

No estoy 100% seguro de que si esta es la razón, pero no vi que llamar a view.setontouchlistener en su código para Gesturelistener.Yo hubiera esperado línea;

setOnTouchListener(gestureListener)

después de haberlo creado.

Otros consejos

Intenta regresar true de tu MyGestureDetector.onDown.La implementación de la superclase es regresar false que luego suprime la entrega de eventos futuros hasta que se suelta el toque.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top