web-dev-qa-db-fra.com

Android - Détection de gestes (glisser vers le haut / bas) sur une vue particulière

J'essaie d'implémenter OnGestureListener dans Android.
J'ai trois TextViews dans ma mise en page.
Ce que j'essaie de réaliser, c'est de définir l'écouteur de geste pour deux des textViews.
Voici le layout -

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/rlMain"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" >

<TextView
    Android:id="@+id/tvOne"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_centerHorizontal="true"
    Android:layout_marginBottom="10dp"
    Android:layout_marginTop="5dp"
    Android:gravity="center"
    Android:text="One" />

<TextView
    Android:id="@+id/tvTwo"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_below="@+id/tvOne"
    Android:layout_centerHorizontal="true"
    Android:layout_marginBottom="10dp"
    Android:layout_marginTop="5dp"
    Android:gravity="center"
    Android:text="Two" />

<TextView
    Android:id="@+id/tvThree"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_below="@+id/tvTwo"
    Android:layout_centerHorizontal="true"
    Android:layout_marginBottom="10dp"
    Android:layout_marginTop="5dp"
    Android:gravity="center"
    Android:text="Three" />

Et voici le activité -

import Android.app.Activity;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.GestureDetector;
import Android.view.GestureDetector.OnGestureListener;
import Android.view.MotionEvent;

public class TimeActivity extends Activity implements OnGestureListener {

GestureDetector gestureScanner;

@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.wheelview);
    gestureScanner = new GestureDetector(this);

}

@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    return gestureScanner.onTouchEvent(event);
}

@Override
public boolean onDown(MotionEvent e) {
    // TODO Auto-generated method stub
    return true;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
    // TODO Auto-generated method stub
    Log.i("Test", "On Fling");
    return true;
}

@Override
public void onLongPress(MotionEvent e) {
    // TODO Auto-generated method stub

}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public void onShowPress(MotionEvent e) {
    // TODO Auto-generated method stub

}

@Override
public boolean onSingleTapUp(MotionEvent e) {
    // TODO Auto-generated method stub
    return false;
}

}

À l'heure actuelle, Fling est appelé pour les trois vues de texte.
Existe-t-il un moyen par lequel je peux définir le Gesture Listener pour certaines vues particulières dans la mise en page.
Toute aide sera grandement appréciée.

24
Anukool

Faites cela dans votre méthode onCreate.

findViewById(R.id.tvOne).setOnTouchListener(new View.OnTouchListener() { 
            @Override
           public boolean onTouch(View v, MotionEvent event){
                return gestureScanner.onTouchEvent(event);
           }
  });
27
M-WaJeEh

Vous pouvez définir OnTouchListeners sur des TextViews individuels.

findViewById(R.id.tvOne).setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View view, MotionEvent event) {
         // Your code here
    }
}
10
jaibatrik

Une suggestion

Si vous ne voulez pas détecter tous les gestes, essayez cette classe: SimpleGestureListener créée par moi-même.

Voici maintenant quelques extraits pour l'utilisation de cette classe.

Usage

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private GestureDetector mDetector;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SimpleGestureListener simpleGestureListener = new SimpleGestureListener();
        simpleGestureListener.setListener(new SimpleGestureListener.Listener() {
            @Override
            public void onScrollHorizontal(float dx) {
                Log.i(TAG,"horizontal = " +dx);
            }

            @Override
            public void onScrollVertical(float dy) {
                Log.i(TAG,"vertical = " +dy);
            }
        });
        mDetector = new GestureDetector(this, simpleGestureListener);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }
}

Il peut être utilisé pour détecter le geste de balayage:

  • gauche ou droite
  • haut ou bas
2
user6796845