Я пытаюсь изменить некоторый код, который я нашел онлайн к моим потребностям. Это, как предполагается, ловит MotionEvent (бросок в особенности) и запускает отдельное действие. Я плохо знаком с Java, таким образом, я испытываю некоторые затруднения при понимании кода. Вот то, что я имею до сих пор:
public class Hypertension extends Activity {
private GestureDetector flingDetector;
View.OnTouchListener gestureListener;
private TextView redView;
private TextView greenView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
redView = (TextView)findViewById(R.id.buttonRed);
greenView = (TextView)findViewById(R.id.buttonGreen);
redView.setOnTouchListener(gestureListener);
greenView.setOnTouchListener(gestureListener);
flingDetector = new GestureDetector(new MyFlingListener());
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (flingDetector.onTouchEvent(event)) {
//startActivity(new Intent(Hypertension.this, Green.class));
return true;
}
return false;
}
};
}
class MyFlingListener extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// TODO Auto-generated method stub
startActivity(new Intent(Hypertension.this, Green.class));
return false;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (flingDetector.onTouchEvent(event))
return true;
else
return false;
}
}
Мое понимание - то, что, когда экран затронут, onTouchEvent называют. В вышеупомянутом коде этот метод переопределяется для вызова flingDetector, который прислушивается к броску. Если Вас слышат, это запускает действие.
На данный момент, однако, ничего не происходит, когда я выполняю бросок в эмуляторе. Кроме того, я справедливо смущен относительно того, что на самом деле представляют возвращаемые значения различных булевых методов.
В вашем коде есть два метода onTouchEvent
. Один находится в классе GestureDetector
(не переопределен), а другой - в вашем классе активности Hypertension
(который вы переопределили внизу).
Когда кто-то вызывает TouchEvent в основной активности, вы явно вызываете GestureDetector
(передавая событие) здесь:
if (flingDetector.onTouchEvent(event)) return true;
Но если вы не переопределили метод onTouchEvent этого класса, то ничего не произойдет!
Цель переопределения этих методов "onSomething()" состоит в том, чтобы они вызывались автоматически при срабатывании события. В целом работать со слушателями можно следующим образом:
Для всех прослушивателей событий, которые возвращают логическое значение, он должен возвращать true при обработке события, поэтому в вашем примере, если flingDetector обрабатывает onTouchEvent, он возвращает true.
Этот вопрос задавался раньше, и на него есть несколько отличных ответов.