studio setontouchlistener ejemplo android ontouchlistener actionevent

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>