android - example - Evento OnUp en GestureDetector
ontouchevent (4)
Mi pregunta es simple, ¿dónde está el evento onUp al implementar un GestureListener?
Tengo muchos eventos en el detector de gestos y no puedo simplemente consumir el evento onUp del oyente, porque uno de los eventos es el onSingleTapConfirmed que lo necesita.
¿Ha regresado verdadero de los otros eventos que consume en su GestureDetector.OnGestureListener? Tuve este problema y resulta que si devuelve falso, el sistema asume que no está interesado y deja de pasarle los eventos, por lo que se pierde la oportunidad.
Las otras respuestas pueden resolver la pregunta, quizás funcionen bien, pero no creo que esas sean buenas soluciones.
Debido a que debemos tratar el evento en un solo movimiento, para que podamos ser más fáciles de mantener o expandir el código.
(Por cierto, no use onFilng()
, si su dedo se mueve lentamente en la pantalla, onFilng()
no funcionará)
Entonces, mi solución es reescribir el GestureDetector :
public class ModifyGestureDetector extends GestureDetector {
MyGestureListener myGestureListener;
public ModifyGestureDetector(Context context, OnGestureListener listener) {
super(context, listener);
init(listener);
}
void init(OnGestureListener listener){
if (listener instanceof MyGestureListener){
myGestureListener = (MyGestureListener) listener;
}
}
//u can write something more complex as long as u need
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(ev.getAction() == MotionEvent.ACTION_UP
&& myGestureListener != null){
myGestureListener.onUp(ev);
}
return super.onTouchEvent(ev);
}
public interface MyGestureListener{
public void onUp(MotionEvent ev);
}
}
Y el oyente:
public class MyGestureListener extends GestureDetector.SimpleOnGestureListener
implements ModifyGestureDetector.MyGestureListener {
@Override
public void onUp(MotionEvent ev) {
//do what u want
}
}
:)
Lo arreglé leyendo el Action event
antes de pasarlo a GestureListener
img.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
if (arg1.getAction() == MotionEvent.ACTION_UP
&& !getDocument().isScaled())
img.notifyUp();
return gestures.onTouchEvent(arg1);
}
});
Trate de usar onFling()
. Parece un nombre extraño, pero para mí, funciona como el método onUp()
lógicamente funcionaría. O prueba este método ...
@Override
public boolean onTouchEvent(MotionEvent me) {
Log.v("ADAM", "ontouch: " + me.getAction());
if(me.getAction() == 0){
Log.v("ADAM", "Down");
}
else if (me.getAction() == 1) {
Log.v("ADAM", "Up");
}
else if (me.getAction() == 2) {
Log.v("ADAM", "Scroll");
}
boolean detectedUp = event.getAction() == MotionEvent.ACTION_UP;
if (!mGestureDetector.onTouchEvent(event) && detectedUp) {
return onUp(event);
}
return true;
}