web-dev-qa-db-fra.com

Android: OnTouch, MotionEvent.ACTION_MOVE n'est pas reconnu?

Voici mon code, je veux détecter quand mon doigt descend l'écran donc quand je touche l'écran je détecte le ACTION_DOWN mais quand je descends l'écran avec mon doigt, ACTION_MOVE n'est pas reconnu, ni ACTION_UP Est-ce que tu sais pourquoi?

        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
                    }
                }
            }
}
26
morg

Si votre méthode onTouch() renvoie false en réponse au ACTION_DOWNMotionEvent initial, elle ne recevra aucun des événements ultérieurs qui appartiennent à ce geste particulier . Au lieu de cela, ces événements tactiles seront présentés au parent dans la hiérarchie.

Pour exprimer cela d'une autre manière, si vous retournez false à partir de onTouch() au début d'un geste (le ACTION_DOWN), Cela signale que la méthode ne veut plus voir aucun plus du geste, et que les événements du geste doivent aller au parent View.

Comme le souligne markproxy dans les commentaires ci-dessous, retourner false lorsque le MotionEvent est autre chose qu'un ACTION_DOWN, Tel qu'un ACTION_MOVE Par exemple, va - not empêche les MotionEvents suivants dans le geste courant d'être présentés au View.

92
Trevor

MotionEvent.getAction() renvoie plus que juste le drapeau. Essayez ce qui suit:

int action = arg1.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_MOVE) ...

Vous pouvez également utiliser MotionEvent.getActionMasked(). Voir aussi http://developer.Android.com/reference/Android/view/MotionEvent.html

8
Thalur

Quelques choses:

1) Vous devez renvoyer un booléen pour montrer que vous avez consommé l'événement.

Voici une implémentation très simple qui fonctionne:

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;
            }
        });
    }
}

Voici le fichier 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>
5
Nathaniel

Il y a deux cas:

1) Si vous définissez également OnClickListener () -> onTouch () devrait retourner false.

(Si onTouch () renvoie true, OnClickListener () ne fonctionnera pas)

2) Si vous ne définissez pas OnClickListener () -> onTouch () devrait retourner true.

(Si onTouch () renvoie false, seul ACTION_DOWN est appelé)

2
thanhbinh84

Vérifiez la valeur de retour de la méthode onTouch ().

cela devrait être vrai, pas faux.

return true;

j'espère que cela fonctionnera.

1
Dalvinder Singh