2010-11-04 16 views
41

bien he estado haciendo referencia al código aquí: Fling gesture detection on grid layoutAdición Fling gesto a una vista de la imagen - Android

, pero simplemente no puede conseguir que funcione. En mi actividad principal, tengo una imagen simple definida. Quiero detectar una aventura en la imagen. Aquí está mi código a continuación. El método onclick en la parte inferior está vacío. ¿Es por esto? Lo dejé en blanco porque en el otro código de muestra no es lo que quiero. Solo quiero un brindis simple para que aparezca diciendo "fling right" o "left".

public class GestureRightLeft extends Activity implements OnClickListener { 

    ImageView peek; 

    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; 
    private GestureDetector gestureDetector; 
    View.OnTouchListener gestureListener; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     peek =(ImageView) findViewById(R.id.peek); 
     peek.setImageResource(R.drawable.bluestrip); 

     gestureDetector = new GestureDetector(new MyGestureDetector()); 
     gestureListener = new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (gestureDetector.onTouchEvent(event)) { 
        return true; 
       } 
       return false; 
      } 
     }; 
    } 

    class MyGestureDetector extends SimpleOnGestureListener { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      try { 
       if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
        return false; 
       // right to left swipe 
       if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        Toast.makeText(GestureRightLeft.this, "Left Swipe", Toast.LENGTH_SHORT).show(); 
       } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        Toast.makeText(GestureRightLeft.this, "Right Swipe", Toast.LENGTH_SHORT).show(); 
       } 
      } catch (Exception e) { 
       // nothing 
      } 
      return false; 
     } 
    } 

    @Override 
    public void onClick(View v) {} 
} 
+0

Véase también [Cómo agregar un detector gesto a una vista en Android] (https://stackoverflow.com/questions/45054908/cómo hacerlo add-a-gesture-detector-to-a-view-in-android) – Suragch

Respuesta

83

Aquí está la versión de trabajo más simple de Flinger que se me ocurre. En realidad, puede vincularlo a cualquier componente, no solo a ImageView.

public class MyActivity extends Activity { 
    private void onCreate() { 
     final GestureDetector gdt = new GestureDetector(new GestureListener()); 
     final ImageView imageView = (ImageView) findViewById(R.id.image_view); 
     imageView.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(final View view, final MotionEvent event) { 
       gdt.onTouchEvent(event); 
       return true; 
      } 
     }); 
    }    

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

    private class GestureListener extends SimpleOnGestureListener { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       return false; // Right to left 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       return false; // Left to right 
      } 

      if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) { 
       return false; // Bottom to top 
      } else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) { 
       return false; // Top to bottom 
      } 
      return false; 
     } 
    } 
} 

Ninguna actividad OnClickListener aunque (si no es necesario coger cualquier acción onclick) No sólo captura horizontal, sino vertical también (solo borrar parte vertical si no lo necesita), y horizontal los golpes tienen prioridad como puedes ver. En lugares en los que devuelve el método (NAD donde mis comentarios son) Simplemente llame a su método o lo que sea :)

+0

Me ayudó a entender GestureDetector y arroja ...... – Gopinath

+3

Usar 'GestureDetector final gdt = GestureDetector (esto, nuevo GestureListener());' en su lugar, por http://developer.android.com/reference/android/view/GestureDetector.html#GestureDetector(android.view.GestureDetector.OnGestureListener) – Richard

+0

Esto es más parecido a paginación. Un buen ejemplo de arrojamiento se puede encontrar aquí: http://developer.android.com/training/custom-views/making-interactive.html – Snicolas

13

probar este

imageView.setOnTouchListener(new View.OnTouchListener() { 

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

** + 1 ** gracias tío funcionó para mí .. devuelvo verdadero en lugar de falso. ahora mi problema resuelto –

+1

@Ganapathy puede actualizar la respuesta con un código de trabajo por favor –

+0

@contactmeandroid dentro si la condición también devuelvo verdadero; funcionó para mí. –

9
imageView.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return !gestureDetector.onTouchEvent(event); 
    } 
}); 
3

algunos de la condición previa

1)setonClick method 
    image.setOnClickListener(this); 

2)set your gesture detection in onTouch() 
    image.setOnTouchListener(new OnTouchListener() { 
     GestureDetector gestureDetector = new GestureDetector(new SwingGestureDetection((mContext),image,a)); 
     @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       return gestureDetector.onTouchEvent(event); 
     } 
    }); 

3)create SwingGestureDetection class and implement all method 
@Override 
public boolean onFling(MotionEvent start, MotionEvent finish, float arg2,float arg3) { 
    if(start.getRawX()<finish.getRawX()){ 
     System.out.println("next...swing"); 
    }else{ 
    System.out.println("previois...swing"); 


} 

4)pass your imageview in constructor 
public SwingGestureDetection(Context con,ImageView image,int pos) { 
    mContext=con; 
    this.image=image; 
    this.position=pos; 
} 

Este es el trabajo perfecto para cualquier consulta me.if a continuación, poner comentarios.

0

Si está buscando un método como ImageView.setOnGestureListener, no hay ninguno. Puede ir a ver el código fuente de Android. Su mejor opción es manejarlo en onTouch() del objeto View.

Este es el GestureDetector más simple que puedo hacer.

Tengo una clase llamada GenesMotionDetector.java. Aquí está el código:

package gene.com.motioneventssample; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class GenesMotionDetector extends Activity implements GestureDetector.OnGestureListener { 
    private GestureDetector gestureScanner; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.nothing); 
     gestureScanner= new GestureDetector(getBaseContext(),this); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent me) { 
     System.out.println("Inside onTouchEvent() of GenesMotionDetector.java"); 
     return gestureScanner.onTouchEvent(me); 
    } 

    @Override 
    public boolean onDown(MotionEvent e) { 
     System.out.println("Inside onDown() of GenesMotionDetector.java"); 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     System.out.println("Inside onFling() of GenesMotionDetector.java"); 
     return true; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
     System.out.println("Inside onLongPress() of GenesMotionDetector.java"); 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     System.out.println("Inside onScroll() of GenesMotionDetector.java"); 
     return true; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) { 
     System.out.println("Inside onShowPress() of GenesMotionDetector.java"); 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     System.out.println("Inside onSingleTapUp() of GenesMotionDetector.java"); 
     return true; 
    } 
} 

El archivo de diseño XML correspondiente para esa clase es nothing.xml. Aquí está el código para ello:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/screen" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/text" 
     android:background="#17528c" 
     android:text="testing" 
     android:layout_width="100dp" 
     android:layout_height="200dp" /> 

    <ImageView 
     android:id="@+id/image" 
     android:background="#f8af20" 
     android:layout_width="100dp" 
     android:layout_height="200dp" /> 
</LinearLayout> 

Ahora, tomando el GestureDetector más simple que puedo hacer (desde arriba) y modificándola por lo que quieres, me sale esto:

package gene.com.motioneventssample; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.VelocityTracker; 
import android.view.View; 
import android.widget.ImageView; 

public class GenesMotionDetector3 extends Activity implements GestureDetector.OnGestureListener { 
    private GestureDetector gestureScanner; 
    ImageView mView3; 

    View.OnTouchListener gestureListener; 
    MotionEvent initialME, finalME; 
    private VelocityTracker mVelocityTracker = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.nothing); 


     mView3 = (ImageView) findViewById(R.id.image); 

     // Gesture detection 
     gestureScanner = new GestureDetector(getBaseContext(), this); 

     gestureListener = new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch(event.getAction()){ 
        case MotionEvent.ACTION_DOWN: 
         initialME= event; 

         if(mVelocityTracker == null) { 
          // Retrieve a new VelocityTracker object to watch the velocity of a motion. 
          mVelocityTracker = VelocityTracker.obtain(); 
         } 
         else { 
          // Reset the velocity tracker back to its initial state. 
          mVelocityTracker.clear(); 
         } 
         // Add a user's movement to the tracker. 
         mVelocityTracker.addMovement(event); 

         break; 
        case MotionEvent.ACTION_MOVE: 
         mVelocityTracker.addMovement(event); 
         // When you want to determine the velocity, call 
         // computeCurrentVelocity(). Then call getXVelocity() 
         // and getYVelocity() to retrieve the velocity for each pointer ID. 
         mVelocityTracker.computeCurrentVelocity(1000); 
         break; 
        case MotionEvent.ACTION_UP: 
         finalME=event; 
         break; 
        case MotionEvent.ACTION_CANCEL: 
         // Return a VelocityTracker object back to be re-used by others. 
         mVelocityTracker.recycle(); 
         break; 
       } 
       return onFling(initialME, finalME, mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity()); 
       //return false; 
      } 
     }; 

     mView3.setOnTouchListener(gestureListener); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent me) { 
     System.out.println("Inside onTouchEvent() of GenesMotionDetector.java"); 

     return gestureScanner.onTouchEvent(me); 
    } 

    @Override 
    public boolean onDown(MotionEvent e) { 
     System.out.println("Inside onDown() of GenesMotionDetector.java"); 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     System.out.println("Inside onFling() of GenesMotionDetector.java"); 
     System.out.println("e1= "+ e1); 
     System.out.println("e2= "+ e2); 
     System.out.println("velocityX= "+ velocityX); 
     System.out.println("velocityY= "+ velocityY); 
     return true; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
     System.out.println("Inside onLongPress() of GenesMotionDetector.java"); 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     System.out.println("Inside onScroll() of GenesMotionDetector.java"); 
     return true; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) { 
     System.out.println("Inside onShowPress() of GenesMotionDetector.java"); 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     System.out.println("Inside onSingleTapUp() of GenesMotionDetector.java"); 
     return true; 
    } 
} 

puede ser que también acaba manejar todo en onTouch(). Básicamente obtengo los gestos en Toque y pasé a onFling().

0

Diseña tu diseño con ImageView. Agregar setOnTouchListener a imageView. imageview.setOnTouchListener(this) .add método no implementado View.OnTouchListener. Luego, el método onTouch puede implementar su lógica de invitado.Esta muestra ha dicho que de izquierda a derecha y de derecha a guesture izquierda,

float x1,x2; 
float y1, y2; 

@Override 
public boolean onTouch(View view, MotionEvent event) { 
    switch (event.getAction()){ 

     case MotionEvent.ACTION_DOWN:{ 
      x1 = event.getX(); 
      y1 = event.getY(); 
      break; 
     } 

     case MotionEvent.ACTION_UP:{ 
      x2 = event.getX(); 
      y2 = event.getY(); 

      if (x1<x2) { 
       //implement what you need to do here 
      } 
      if (x1>x2) { 
       //implement what you need to do here 
      } 
      break; 
     } 
    } 
    return false; 
} 
+1

La respuesta no proporciona la lógica de fling, OP está buscando. – Sipty

0

si no te gusta para crear una clase separada o hacer complejo código,
Usted sólo puede crear una variable GestureDetector dentro OnTouchListener y hacer que el código sea más más fácil

namVyuVar puede ser cualquier nombre de la vista en la que es necesario establecer la listner

namVyuVar.setOnTouchListener(new View.OnTouchListener() 
{ 
    @Override 
    public boolean onTouch(View view, MotionEvent MsnEvtPsgVal) 
    { 
     flingActionVar.onTouchEvent(MsnEvtPsgVal); 
     return true; 
    } 

    GestureDetector flingActionVar = new GestureDetector(getApplicationContext(), new GestureDetector.SimpleOnGestureListener() 
    { 
     private static final int flingActionMinDstVac = 120; 
     private static final int flingActionMinSpdVac = 200; 

     @Override 
     public boolean onFling(MotionEvent fstMsnEvtPsgVal, MotionEvent lstMsnEvtPsgVal, float flingActionXcoSpdPsgVal, float flingActionYcoSpdPsgVal) 
     { 
      if(fstMsnEvtPsgVal.getX() - lstMsnEvtPsgVal.getX() > flingActionMinDstVac && Math.abs(flingActionXcoSpdPsgVal) > flingActionMinSpdVac) 
      { 
       // TskTdo :=> On Right to Left fling 

       return false; 
      } 
      else if (lstMsnEvtPsgVal.getX() - fstMsnEvtPsgVal.getX() > flingActionMinDstVac && Math.abs(flingActionXcoSpdPsgVal) > flingActionMinSpdVac) 
      { 
       // TskTdo :=> On Left to Right fling 

       return false; 
      } 

      if(fstMsnEvtPsgVal.getY() - lstMsnEvtPsgVal.getY() > flingActionMinDstVac && Math.abs(flingActionYcoSpdPsgVal) > flingActionMinSpdVac) 
      { 
       // TskTdo :=> On Bottom to Top fling 

       return false; 
      } 
      else if (lstMsnEvtPsgVal.getY() - fstMsnEvtPsgVal.getY() > flingActionMinDstVac && Math.abs(flingActionYcoSpdPsgVal) > flingActionMinSpdVac) 
      { 
       // TskTdo :=> On Top to Bottom fling 

       return false; 
      } 
      return false; 
     } 
    }); 
}); 
Cuestiones relacionadas