Мне удалось решить проблему после нескольких дней расследования. Казалось, что лучшим выбором было реализовать GestureDetector
как этот
public class MyGestureDetector extends GestureDetector.SimpleOnGestureListener {
private MainGame mainGame;
MyGestureDetector(MainGame mainGame) {
this.mainGame = mainGame;
}
@Override
public boolean onDown(MotionEvent e) {
Log.d("Gesture", "onDown");
return super.onDown(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.d("Gesture", "onSingleTapConfirmed");
return true;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.d("Gesture", "onSingleTapUp");
return true;
}
@Override
public void onShowPress(MotionEvent e) {
Log.d("Gesture", "onShowPress");
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.d("Gesture", "onDoubleTap");
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.d("Gesture", "onDoubleTapEvent");
return true;
}
@Override
public void onLongPress(MotionEvent e) {
Log.d("Gesture", "onLongPress");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.d("Gesture", "onScroll");
if (e1.getY() < e2.getY()) {
Log.d("Gesture", "Scroll Down");
}
if (e1.getY() > e1.getY()) {
Log.d("Gesture", "Scroll Up");
}
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1.getY() < e2.getY()) {
Log.d("Gesture", "Swipe Down " + e1.getY() + " - " + e2.getY());
mainGame.getSupportActionBar().hide();
}
if (e1.getY() > e2.getY()) {
Log.d("Gesture", "Swipe Up" + e1.getY() + " - " + e2.getY());
mainGame.getSupportActionBar().hide();
}
return true;
}
}
и реализовать его в моей основной деятельности в качестве onTouch
со слушателями для каждой части макета в моей основной деятельности.
В onCreate
:
layout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mViewSelected = v;
mGestureDetector.onTouchEvent(event);
return false;
}
});
gameScoreP1.setOnTouchListener(this);
gameScoreP2.setOnTouchListener(this);
fullNameP1.setOnTouchListener(this);
fullNameP2.setOnTouchListener(this);
и способ переопределения жестов:
@Override
public boolean onTouch(View v, MotionEvent event) {
if (myGestureDetector.onSingleTapConfirmed(event)) {
switch (v.getId()) {
case R.id.fullNameP1:
diagUtils.changePlayerNameDialog(1, this);
return false;
case R.id.fullNameP2:
diagUtils.changePlayerNameDialog(2, this);
return false;
case R.id.gameScoreP1:
scoreSetter.manageGameSetPoints(1);
return false;
case R.id.gameScoreP2:
scoreSetter.manageGameSetPoints(2);
return false;
default:
return false;
}
} else return true;
}
Проблема теперь в том, что когда я выполняю движение броска над видом, например, gameScoreP1, он также обнаруживает щелчок. Есть ли способ сделать это эксклюзивным?
EDIT
Также удалось решить вторую проблему, установив такие интерактивные представления, как: fullNameP1.setClickable(true)