setontouchlistener - Android: OnTouch, MotionEvent.ACTION_MOVE no se reconoce?
ontouchlistener android ejemplo (5)
Compruebe el valor de retorno del método onTouch ().
debe ser cierto, no falso.
return true;
Espero que funcione.
Aquí está mi código, quiero detectar cuando mi dedo baja por la pantalla, así que cuando toco la pantalla detecto el ACTION_DOWN
pero cuando voy por la pantalla con el dedo, ACTION_MOVE
no se reconoce, ni ACTION_UP
¿Sabes por qué?
float x=0;
protected void onCreate(Bundle savedInstanceState) {
do things
ImageView image2 = (ImageView) findViewById(R.id.imageView3);
image2.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
if (arg1.getAction()==MotionEvent.ACTION_DOWN) {
x=arg1.getX();
}
else {
if (arg1.getAction()==MotionEvent.ACTION_MOVE){
if (arg1.getX()>x) {
do things
}
}
else {
if (arg1.getAction()==MotionEvent.ACTION_UP){
do things
}
}
}
}
Hay dos casos:
1) Si también configura OnClickListener () -> onTouch () debería devolver falso.
(Si onTouch () devuelve true, OnClickListener () no funcionará)
2) Si no configura OnClickListener () -> onTouch () debería devolver verdadero.
(Si onTouch () devuelve falso, solo se llama a ACTION_DOWN)
Si su método onTouch()
devuelve false
en respuesta al ACTION_DOWN
inicial de ACTION_DOWN
MotionEvent
, no recibirá ninguno de los eventos posteriores que pertenecen a este gesto en particular. En su lugar, esos eventos táctiles se presentarán al padre en la jerarquía.
Para expresarlo de otra manera, si devuelve false
desde onTouch()
durante el inicio de un gesto (el ACTION_DOWN
), indica que el método ya no quiere ver más el gesto, y que los eventos del gesto deben ir al View
padres.
Como señala markproxy en los comentarios a continuación, devolver false
cuando el MotionEvent
es un ACTION_DOWN
, como por ejemplo un ACTION_MOVE
, no impedirá que los MotionEvent
subsiguientes en el gesto actual se presenten a la View
.
Un par de cosas:
1) Es necesario que devuelva un valor booleano para mostrar que la vista consumió el evento.
Aquí hay una implementación muy simple que funciona:
package com.test;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class TestProjActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final String TAG = "TEST_TAG";
View v = findViewById(R.id.touchTest);
v.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN) {
Log.e(TAG,"Down");
return true;
}
if (event.getAction()==MotionEvent.ACTION_MOVE){
Log.e(TAG,"Move");
return true;
}
if (event.getAction()==MotionEvent.ACTION_UP){
Log.e(TAG,"Up");
return true;
}
return false;
}
});
}
}
Aquí está el main.xml
::
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/touchTest"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
MotionEvent.getAction()
devuelve más que solo la bandera. Intenta lo siguiente:
int action = arg1.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_MOVE) ...
También puede usar MotionEvent.getActionMasked()
. Consulte también http://developer.android.com/reference/android/view/MotionEvent.html