Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding Fling Gesture to an image view - Android

Okay I have been referencing the code here: Fling gesture detection on grid layout

but just can not get it to work. In my main activity I have a simple image defined. I want to detect a fling on the image. Here is my code below. The onclick method at the bottom is empty. Is it because of this? I left it blank because in the other code sample its not what I want. I just want a simple toast to pop up saying fling right or fling 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) {} } 
like image 748
Ryan Avatar asked Nov 04 '10 15:11

Ryan


2 Answers

Here's the simpliest working version of flinger I can think of. You can actually tie it to any component, not only 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;         }     } } 

No activity onClickListener though (if you don't need to catch any onclick actions) It captures not only horizontal, but vertical also (just delete vertical part if you don't need it), and horizontal swipes have priority as you can see. In places where method returns (nad where my comments are) just call your method or whatever :)

like image 161
Alex Orlov Avatar answered Oct 22 '22 19:10

Alex Orlov


Try this

imageView.setOnTouchListener(new View.OnTouchListener() {          @Override         public boolean onTouch(View v, MotionEvent event) {             if (gestureDetector.onTouchEvent(event)) {                 return false;             }             return true;         }   }); 
like image 40
Pavan Avatar answered Oct 22 '22 19:10

Pavan