Проблема с onFling и SimpleOnGestureListener
-
12-11-2019 - |
Вопрос
Я реализую детектор 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
который затем подавляет доставку будущих событий до тех пор, пока касание не будет отпущено.