2010-04-09 10 views
13

Tengo problemas para que mi actividad genere un MotionEvent.ACTION_UP. Probablemente un error de principiante.Principiante de Android: comprensión de las acciones de MotionEvent

En LogCat, solo estoy viendo el evento ACTION_MOVE (que es un valor int de 3). También veo las coordenadas X/Y. Sin ACTION_DOWN y sin ACTION_UP.

Busqué una solución en todas partes. He encontrado una pregunta en un foro que parece ser el mismo que mi problema, pero no se propone una solución: http://groups.google.com/group/android-developers/browse_thread/thread/9a9c23e40f02c134/bf12b89561f204ad?lnk=gst&q=ACTION_UP#bf12b89561f204ad

Aquí está mi código:

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.webkit.WebView; 

public class Brand extends Activity { 

public WebView webview; 
public float currentXPosition; 
public float currentYPosition; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

    webview = new WebView(this); 
    setContentView(webview); 
    webview.loadUrl("file:///android_asset/Brand.html"); 


} 

@Override 
public boolean onTouchEvent(MotionEvent me) { 

    int action = me.getAction(); 
    currentXPosition = me.getX(); 
    currentYPosition = me.getY(); 

    Log.v("MotionEvent", "Action = " + action); 
    Log.v("MotionEvent", "X = " + currentXPosition + "Y = " + currentYPosition); 

    if (action == MotionEvent.ACTION_MOVE) { 
     // do something 
    } 


    if (action == MotionEvent.ACTION_UP) { 
     // do something 
    } 

    return true; 
    } 

} 
+0

[rgr-mt] (http://stackoverflow.com/users/550152/rgr-mt) señaló en una [edición sugerida] (http://stackoverflow.com/edit-suggestions/5528) que " El valor int de 3 es ACTION_CANCEL, querías decir 2 (ACTION_MOVE) " –

Respuesta

10

Su problema es que usted está haciendo esto desde dentro de un WebView. WebViews tiene un control táctil incorporado para permitir al usuario desplazarse por la página, y eso debe interferir con la recepción de MotionEvents. Parece que necesitarás usar una vista diferente. Por ejemplo, me acaba de ejecutar su código haciendo la siguiente sustitución:

TextView tv = new TextView(this); 
setContentView(tv); 

en lugar de

webview = new WebView(this); 
setContentView(webview); 
webview.loadUrl("file:///android_asset/Brand.html"); 

y todo lo demás funcionaba. Nota: utilicé un TextView como vista completa solo por simplicidad. Esto funciona en ViewGroups como LinearLayouts, RelativeLayouts, Vistas personalizadas con lienzos, etc. Parece que las WebViews son especiales. (También estaba recibiendo ACTION_MOVE cuando uso WebView). Por lo tanto, espero que pueda usar algo que no sea WebView.

+0

¡Gracias por la respuesta! ¡Hace las cosas un poco más complicadas, pero al menos funcionará! :) – Dave

12

Primero debe seguir el Webview tutorial para dejar que WebViewClient en lugar del navegador predeterminado haga el trabajo. Sin eso, después de cargar una página web, no obtendría ningún evento en absoluto.

Suponiendo que se desea manejar los eventos en su acrtivity puede agregar el método dispatchTouchEvent:

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    Log.v("FROM_DISPATCH_TOUCH_EVENT", "Action = " + ev.getAction()); 
    return false; 
} 

podrás ver los otros eventos de toque también. Deberías manejarlos en este método.

Una aplicación alternativa es registrar un EventListener.Su clase se convertiría en:

public class Brand extends Activity implements OnTouchListener { 

en onCreate() hacer esto:

webview.setOnTouchListener(this); 

un complemento esto a la Actividad:

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    int action = event.getAction(); 
    float x = event.getX(); 
    float y = event.getY(); 

    Log.v("ON_TOUCH", "Action = " + action + " View:" + v.toString()); 
    Log.v("ON_TOUCH", "X = " + x + "Y = " + y); 

return false; 

}

De mis registros Luego recibo lo siguiente:

  1. dispatchTouchEvent() se llama primera
  2. Entonces onTouch() se llama
  3. entonces la vista obtiene el Evento de manejarlo
  4. Entonces onTouchEvent() podrían obtener los eventos (ver a continuación)

Por otra parte, onTouch() reportajes relativos a la vista , dispatchTouchEvent() informa los valores relativos a la pantalla.

¿Por qué onTouchEvent no informa estos eventos? Al igual que muchos de estos métodos, hay dos encarnaciones de onTouchEvent().

Si invalida onTouchEvent() en su Actividad, sirve como "atrapar todo": solo maneja los eventos que las Vistas no han consumido, por ejemplo, si toca fuera de cualquier Vista o los eventos que pasan en. Si sobrescribe onTouchEvent() en su Ver, se supone que debe manejar los eventos en esa Vista. A veces es fácil confundir a los dos.

Cuestiones relacionadas