Это не совсем ответ на ваш вопрос, но я думаю, что это хорошее предложение. У меня была такая же проблема, когда я пытался обнаружить . Я мог только получить два из этих событий, чтобы правильно зарегистрировать. После того, как я пару дней общался с ним, я решил искать другие варианты и наткнулся на GestureDetector
, попробовал, и он отлично работал. Вы можете найти API docs here для GestureDetector
. Я также дам вам несколько кодов, чтобы помочь.
Так я использовал GestureDetector
в своем коде. На самом верху, я объявил частный GestureDetector
:
private GestureDetector gestureDetector;
Затем в методе onCreate()
, я называю это метод, который создает GestureDetector
(нет никаких причин, чтобы сделать это таким образом более просто создать его в onCreate()
метод - это просто выглядит чище, так и более организованными):
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
gestureDetector = createGestureDetector(this);
}
метод createGestureDetector()
выглядит следующим образом:
private GestureDetector createGestureDetector(Context context) {
GestureDetector gestureDetectorTemp = new GestureDetector(context, new GestureDetector.OnGestureListener() {
//we are creating our gesture detector here
@Override
public boolean onDown(MotionEvent motionEvent) {
return false;
}
@Override
public void onShowPress(MotionEvent motionEvent) {
}
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) { //onTap
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.playSoundEffect(SoundEffectConstants.CLICK); //if we tap once, play a click sound
return false;
}
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent2, float distanceX, float distanceY) {
return false; //this is the wrong kind of scroll
}
@Override
public void onLongPress(MotionEvent motionEvent) {
}
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) { //fling = a single slide
int dx = (int) (motionEvent2.getX() - motionEvent.getX()); //figure out the distance moved horizontally
int dy = (int) (motionEvent2.getY() - motionEvent.getY()); //figure out the distance moved vertically
//if dx > 0, moved forward, if dx < 0, moved backward
//if dy > 0, moved up, if dy < 0, moved down
return true;
}
});
return gestureDetectorTemp;
}
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
if (gestureDetector != null) {
return gestureDetector.onTouchEvent(event);
}
return false;
}
Вы должны быть уверены, что включите этот метод onGenericMotionEvent()
, который у меня есть в конце. Именно это гарантирует, что ваш GestureDetector
уведомляется каждый раз, когда происходит событие движения.
Последнее, что нужно отметить, это возврат в GestureDetector
- вы возвращаете true, чтобы потреблять событие, или false, чтобы не потреблять его. Другими словами, если вы хотите переопределить то, что происходит по умолчанию, например, закрыть приложение, когда вы сдвигаетесь вниз, просто перейдите в событие onFling()
, и если dy < 0, верните true. Это расходует событие и не отправляет его другим методам по умолчанию.
Возможно, у вас могут быть другие виды, которые захватывают прикосновение, прежде чем оно перейдет к вашему обратному вызову. – pt2121
У меня только событие itemOnClick. Я попытался использовать GestureDetector, как они предположили, что тоже не работает. Вы, вероятно, правы. Мне нужно будет изучить это. – rottenoats
Из документа, похоже, onGenericMotionEvent называется последним. http://developer.android.com/reference/android/app/Activity.html#onGenericMotionEvent(android.view.MotionEvent) – pt2121