2011-05-12 12 views
9

¿Hay algo así como onLeftSwipeListener y onRightSwipeListener en Android? Quiero cambiar las vistas deslizando el dedo hacia atrás y hacia adelante. Uso un FrameLayout y un ImageView dentro de él.oyentes Swipe en Android

Respuesta

13

Se llama GestureDetector y SimpleOnGestureListener que tiene onFling(). Se llama aventura y no deslizar en este contexto :)

+2

Oh, ya veo. ¿Pero puede distinguir entre arrojarse a la izquierda y arrojarse a la derecha? – lomza

+1

Puede encontrar detalles aquí: http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html#onFling(android.view.MotionEvent, android.view.MotionEvent, float, float) – alopix

+0

y uno más pregunta. ¿Sería suficiente usar intenciones para cambiar de vista o es una manera tonta? – lomza

0

He aquí una quetion relacionada acerca de la implementación de los gestos de detección:

Fling gesture detection on grid layout

También es posible usar un ViewFlipper con un poco de animación para cambiar entre las vistas, se ve bueno, aquí está un ejemplo de implementación para permitir que pase a la izquierda/derecha en un viewflipper:

http://www.inter-fuser.com/2009/07/android-transistions-slide-in-and-slide.html

+0

¿Puedo hacer fling (deslizar) en mi emulador? – lomza

+0

Sí, no debería haber problemas – BFil

+0

Utilicé el fragmento de código de Gav, pero no importa si cambio de página o simplemente hago clic, siempre obtengo un clic. ¿Cómo puedo tenerlos a ambos? ¿Cómo puedo distinguir entre ellos? – lomza

6

he hecho un pequeño ejemplo de i swiper En Android, me gustaría compartir el código contigo.

Chek this.

// DISEÑO ///

<?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" > 

    <ViewFlipper 
     android:id="@+id/view_flipper" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_gravity="center_vertical" > 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Soy A" 
      android:textColor="#FFFFFF" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Soy B" 
      android:textColor="#BBBFFF" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Soy C" 
      android:textColor="#FFBBFF" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Soy D" 
      android:textColor="#FFFFAF" /> 
    </ViewFlipper> 

</LinearLayout> 

/// /// ACTIVIDAD

import android.app.Activity; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.animation.AccelerateInterpolator; 
import android.view.animation.Animation; 
import android.view.animation.TranslateAnimation; 
import android.widget.ViewFlipper; 

public class SwipeActivity extends Activity { 

    private Animation mInFromRight; 
    private Animation mOutToLeft; 
    private Animation mInFromLeft; 
    private Animation mOutToRight; 
    private ViewFlipper mViewFlipper; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mViewFlipper = (ViewFlipper) findViewById(R.id.view_flipper); 
     mViewFlipper.setDisplayedChild(0); 
     initAnimations(); 
    } 

    private void initAnimations() { 
     mInFromRight = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 
       +1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, 
       Animation.RELATIVE_TO_PARENT, 0.0f, 
       Animation.RELATIVE_TO_PARENT, 0.0f); 
     mInFromRight.setDuration(500); 
     AccelerateInterpolator accelerateInterpolator = new AccelerateInterpolator(); 
     mInFromRight.setInterpolator(accelerateInterpolator); 

     mInFromLeft = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 
       -1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, 
       Animation.RELATIVE_TO_PARENT, 0.0f, 
       Animation.RELATIVE_TO_PARENT, 0.0f); 
     mInFromLeft.setDuration(500); 
     mInFromLeft.setInterpolator(accelerateInterpolator); 

     mOutToRight = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 
       0.0f, Animation.RELATIVE_TO_PARENT, +1.0f, 
       Animation.RELATIVE_TO_PARENT, 0.0f, 
       Animation.RELATIVE_TO_PARENT, 0.0f); 
     mOutToRight.setDuration(500); 
     mOutToRight.setInterpolator(accelerateInterpolator); 

     mOutToLeft = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, 
       Animation.RELATIVE_TO_PARENT, -1.0f, 
       Animation.RELATIVE_TO_PARENT, 0.0f, 
       Animation.RELATIVE_TO_PARENT, 0.0f); 
     mOutToLeft.setDuration(500); 
     mOutToLeft.setInterpolator(accelerateInterpolator); 

     final GestureDetector gestureDetector; 
     gestureDetector = new GestureDetector(new MyGestureDetector()); 

     mViewFlipper.setOnTouchListener(new OnTouchListener() { 

      public boolean onTouch(View v, MotionEvent event) { 
       if (gestureDetector.onTouchEvent(event)) { 
        return false; 
       } else { 
        return true; 
       } 
      } 
     }); 
    } 

    private class MyGestureDetector extends SimpleOnGestureListener { 

     private static final int SWIPE_MIN_DISTANCE = 120; 
     private static final int SWIPE_MAX_OFF_PATH = 250; 
     private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
       float velocityY) { 
      System.out.println(" in onFling() :: "); 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 
      if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       mViewFlipper.setInAnimation(mInFromRight); 
       mViewFlipper.setOutAnimation(mOutToLeft); 
       mViewFlipper.showNext(); 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       mViewFlipper.setInAnimation(mInFromLeft); 
       mViewFlipper.setOutAnimation(mOutToRight); 
       mViewFlipper.showPrevious(); 
      } 
      return super.onFling(e1, e2, velocityX, velocityY); 
     } 
    } 
} 
+0

su método onFling me ayudó, ¡gracias! – techieWings

+2

bien, esa es la idea, para ayudar a los demás. – shontauro

7
yourView.setOnTouchListner(onThumbTouch); 

    OnTouchListener onThumbTouch = new OnTouchListener() { 
      float previouspoint = 0 ; 
      float startPoint=0; 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch(v.getId()) { 
        case R.id.tvDetailsalaujairiyat: // Give your R.id.sample ... 
         switch(event.getAction()){ 
          case MotionEvent.ACTION_DOWN: 
           startPoint=event.getX(); 
           System.out.println("Action down,..."+event.getX()); 
          break; 
          case MotionEvent.ACTION_MOVE: 

          break; 
          case MotionEvent.ACTION_CANCEL: 
           previouspoint=event.getX(); 
           if(previouspoint > startPoint){ 
            //Right side swipe   
           }else{ 
            // Left side swipe 
           }   
          break; 
         } 
        break; 
       } 
       return true; 
      } 
     }; 
+0

La mejor respuesta ... objetivo! –

Cuestiones relacionadas