Вопрос

Я реализую детектор onFling, очень похожий на следующий вопрос:Обнаружение жестов броска на макете сетки

Однако я просто не могу заставить его работать.

Если эта проблема вызвана какой-то настройкой моего приложения (может быть, асинхронной задачей?), вот как структурировано мое приложение:

(Пытался сделать это красиво отформатированным списком, но по какой-то причине код под ним испортился?)

--MapActivity создает MapView.

--MapView создает ASyncTask для извлечения XML из URL-адреса.

--onPostExecute() ASyncTask анализирует XML и добавляет ItemizedOverlay, используя полученные данные

Функция --onTap() элемента ItemizedOverlay извлекает изображение из Интернета с помощью LoaderImageView (http://www.anddev.org/novice-tutorials-f8/imageview-with-loading-spinner-t49439.html)

Функция --onTap() затем вызывает функцию show() класса PopupPanel, указанного ниже.

Как видно из кода ниже, закомментированные строки работают.Однако события onTouch и onFling никогда не возникают при использовании с классом 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);
        }
    }
}
Это было полезно?

Решение

Я не на 100% уверен, что если это причина, но я не видел звонок на View.SetOntouchListener в вашем коде для GestureListener.Я бы ожидал линию;

setOnTouchListener(gestureListener)
.

После того, как вы создали его.

Другие советы

Попробуйте вернуться true от твоего MyGestureDetector.onDown.Реализация суперкласса должна вернуть false который затем подавляет доставку будущих событий до тех пор, пока касание не будет отпущено.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top