studio detector android imageview gestures onfling

detector - gesture android studio



Agregar Fling Gesture a una vista de imagen-Android (8)

Aquí está la versión más simple de Flinger que puedo imaginar. 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; } } }

Sin embargo, no hay actividad enClickListener (si no necesita capturar ninguna acción onclick) Captura no solo horizontal, sino también vertical (simplemente elimine la parte vertical si no la necesita), y los deslizamientos horizontales tienen prioridad como puede ver. En los lugares donde el método retorna (nad donde están mis comentarios) simplemente llame a su método o lo que sea :)

De acuerdo, he estado haciendo referencia al código aquí: Detección de gestos de Fling en el diseño de la cuadrícula

pero simplemente no puedo hacer 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) {} }


Diseña tu diseño con ImageView. Agregue setOnTouchListener a imageView. imageview.setOnTouchListener(this) .add método no implementado View.OnTouchListener Luego, en el método onTouch puedes implementar tu lógica de invitado. Esta muestra te dice de izquierda a derecha y de derecha a 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; }



Prueba esto

imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event)) { return false; } return true; } });


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 para ello:

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ándolo para lo que quieres, obtengo 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; } }

También podría manejar todo en onTouch (). Básicamente obtengo los gestos en Toque y pasé a onFling ().


Si no desea crear una clase separada o hacer un código complejo,
Puedes crear una variable GestureDetector dentro de OnTouchListener y hacer que tu código sea más fácil

namVyuVar puede ser cualquier nombre de la Vista en la que necesite establecer el 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; } }); });


algunas de las condiciones previas

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 un trabajo perfecto para mí. Si hay alguna consulta, haga un comentario.


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