Question

I'm trying to implement gesture in my app and for some reason the the onfling() is not being called. I tried reading numerous posts regarding this and tried fixing my code but it's not working . The below is my code. Please have a look:

public class MainMenuSlider extends Activity implements OnClickListener{

protected MyGestureListener myGestureListener;

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 ViewFlipper vf;
private Animation animFlipInNext,animFlipOutNext, animFlipInPrevious, animFlipOutPrevious;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.mainmenuslider);
    myGestureListener = new MyGestureListener(this);

    //vf for viewflipper
    vf=(ViewFlipper)findViewById(R.id.ViewFlipper01);
    animFlipInNext = AnimationUtils.loadAnimation(this, R.anim.flipinnext);
    animFlipOutNext = AnimationUtils.loadAnimation(this, R.anim.flipoutnext);
    animFlipInPrevious = AnimationUtils.loadAnimation(this, R.anim.flipinprevious);
    animFlipOutPrevious = AnimationUtils.loadAnimation(this, R.anim.flipoutprevious);

    imageone = (ImageView) findViewById(R.id.imageone);
    imagetwo = (ImageView) findViewById(R.id.imagetwo);
    imageone.setOnClickListener(myGestureListener);
    imagetwo.setOnClickListener(myGestureListener);


} 


class MyGestureListener extends SimpleOnGestureListener implements OnTouchListener
    {
        Context context;
        GestureDetector gDetector;

    public MyGestureListener()
    {
        super();
    }

    public GestureDetector getDetector()
    {
        return gDetector;
    } 

    public MyGestureListener(Context context) 
    {
        this(context, null);
    }

    public MyGestureListener(Context context, GestureDetector gDetector) 
    {

        if(gDetector == null)
            gDetector = new GestureDetector(context, this);

        this.context = context;
        this.gDetector = gDetector;
    }

    public boolean onDown(MotionEvent event) 
    {
        return true;
    }


    @Override
    public boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY)
    {
        try {
            if(e1.getX() > e2.getX() && Math.abs(e1.getX() - e2.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                vf.setInAnimation(animFlipInPrevious);
                vf.setOutAnimation(animFlipOutPrevious);
                vf.showPrevious();
            }else if (e1.getX() < e2.getX() && e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                vf.setInAnimation(animFlipInNext);
                vf.setOutAnimation(animFlipOutNext);
                vf.showNext();
            }
        } catch (Exception e) {
            // nothing
        }
        return true;

    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) 
    {

        return super.onSingleTapConfirmed(e);
    }

    public boolean onTouch(View v, MotionEvent event) 
    {

        // Within the MyGestureListener class you can now manage the event.getAction() codes.

        // Note that we are now calling the gesture Detectors onTouchEvent. And given we've set this class as the GestureDetectors listener 
        // the onFling, onSingleTap etc methods will be executed.
        return gDetector.onTouchEvent(event);
    }


    public void onClick(View v) 
    {
        if (v == imageone)
        {
            Intent j = new Intent(getApplicationContext(), MainActivity.class);
            j.putExtra("slideindex", 0);
            startActivity(j);
        }

        if (v == imagetwo)
        {
            Intent j = new Intent(getApplicationContext(), MainActivity.class);
            j.putExtra("slideindex", 1);
            startActivity(j);
        }
    }

    public boolean onScroll(MotionEvent e1,MotionEvent e2,float distanceX,float distanceY)
    {
        return true;
    }


  }
}

EDIT: Here is the mainmenuslider XML file content as requested

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              android:background="#291E3D" >

            <ScrollView android:layout_width="fill_parent"
                          android:layout_height="fill_parent"
                          android:orientation="vertical" >

                    <LinearLayout android:layout_width="fill_parent"
                                  android:layout_height="fill_parent"
                                  android:gravity="center"
                                  android:orientation="vertical" >

                            <ViewFlipper android:id="@+id/ViewFlipper01"
                                                 android:layout_height="wrap_content" 
                                                 android:layout_width="fill_parent"
                                                 android:gravity="center" >

                                    <!-- adding views to ViewFlipper --> 

                                            <!-- First Slide --> 
                                            <LinearLayout android:layout_width="fill_parent"
                                                          android:layout_height="fill_parent"
                                                          android:gravity="center"
                                                          android:orientation="vertical" >


                                                    <TextView android:id="@+id/title1"
                                                              android:text="title1" 
                                                              android:textColor="#ffffff"
                                                              android:layout_width="fill_parent" 
                                                              android:layout_height="wrap_content" 
                                                              android:gravity="center"
                                                              android:layout_marginBottom="3dip"
                                                              android:textSize="25dip"/>


                                                    <ImageView android:id="@+id/imageone" 
                                                               android:clickable="true"
                                                               android:layout_width="wrap_content" 
                                                               android:layout_height="wrap_content" 
                                                               android:src="@drawable/splash_screen">
                                                    </ImageView>


                                            </LinearLayout>

                                            <!-- Second Slide --> 
                                            <LinearLayout android:layout_width="fill_parent"
                                                          android:layout_height="fill_parent"
                                                          android:gravity="center"
                                                          android:orientation="vertical" >


                                                    <TextView android:id="@+id/title2"
                                                              android:text="title2" 
                                                              android:textColor="#ffffff"
                                                              android:layout_width="fill_parent" 
                                                              android:layout_height="wrap_content"
                                                              android:gravity="center"
                                                              android:layout_marginBottom="3dip"
                                                              android:textSize="25dip" />


                                                    <ImageView android:id="@+id/imagetwo"
                                                               android:clickable="true"
                                                               android:layout_width="wrap_content" 
                                                               android:layout_height="wrap_content" 
                                                               android:src="@drawable/sunnahsplash">
                                                    </ImageView>


                                            </LinearLayout>



                                    </ViewFlipper>





                            <!-- footer -->
                            <LinearLayout android:id="@+id/LinearLayout03"
                                          android:layout_height="wrap_content" 
                                          android:layout_width="wrap_content" 
                                          android:orientation="horizontal" 
                                          android:layout_gravity="center"
                                          android:layout_marginTop="10dip">

                                            <Button android:id="@+id/Button02" 
                                                    android:layout_height="wrap_content" 
                                                    android:text="&lt;Previous" 
                                                    android:textSize="18dip"
                                                    android:layout_width="wrap_content" 
                                                    android:layout_gravity="center"
                                                    android:layout_marginRight="15dip"
                                                    android:padding="5dp"
                                                    android:background="@drawable/background_button_slider"></Button>
                                            <Button android:id="@+id/Select" 
                                                    android:text=" Select " 
                                                    android:textSize="18dip"
                                                    android:layout_height="match_parent" 
                                                    android:layout_width="wrap_content" 
                                                    android:layout_gravity="center"
                                                    android:padding="5dp"
                                                    android:background="@drawable/background_button_slider"></Button>
                                            <Button android:id="@+id/Button01" 
                                                    android:text=" Next&gt;" 
                                                    android:textSize="18dip"
                                                    android:layout_height="match_parent" 
                                                    android:layout_width="wrap_content" 
                                                    android:layout_gravity="center"
                                                    android:layout_marginLeft="15dip"
                                                    android:padding="5dp"
                                                    android:background="@drawable/background_button_slider"></Button>
                            </LinearLayout>

                    </LinearLayout>

            </ScrollView>


</LinearLayout>
Was it helpful?

Solution

According to me the fling is not working because of the scroll view.... Add this code into your MainMenuSlider class.

   GestureDetector gestureDetector
    = new GestureDetector(myGestureListener);

    @Override
    public boolean dispatchTouchEvent(MotionEvent e)
    {
        super.dispatchTouchEvent(e);
        return gestureDetector.onTouchEvent(e);
    }

I have edited your code of class as

      public class MainMenuSlider extends Activity implements OnClickListener{



 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 ViewFlipper vf;
private Animation animFlipInNext,animFlipOutNext, animFlipInPrevious, a   nimFlipOutPrevious;

private ImageView imageone;

private ImageView imagetwo;

 public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main_menu_slider);
//myGestureListener = new MyGestureListener(this);

//vf for viewflipper
vf=(ViewFlipper)findViewById(R.id.ViewFlipper01);
animFlipInNext = AnimationUtils.loadAnimation(this, R.anim.flipinnext);
animFlipOutNext = AnimationUtils.loadAnimation(this, R.anim.flipoutnext);
animFlipInPrevious = AnimationUtils.loadAnimation(this, R.anim.flipinprevious);
animFlipOutPrevious = AnimationUtils.loadAnimation(this, R.anim.flipoutprevious);

imageone = (ImageView) findViewById(R.id.imageone);
imagetwo = (ImageView) findViewById(R.id.imagetwo);
imageone.setOnClickListener(myGestureListener);
imagetwo.setOnClickListener(myGestureListener);


 } 

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

 SimpleOnGestureListener simpleOnGestureListener 
 = new SimpleOnGestureListener(){

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {

    float sensitvity = 50;
    if((e1.getX() - e2.getX()) > sensitvity){
        vf.showPrevious();
    }else if((e2.getX() - e1.getX()) > sensitvity){
        vf.showNext();
    }

    return true;
}

};

 GestureDetector gestureDetector
 = new GestureDetector(simpleOnGestureListener);
 @Override
 public boolean dispatchTouchEvent(MotionEvent e)
 {
super.dispatchTouchEvent(e);
return gestureDetector.onTouchEvent(e);
}
  public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Hello",Toast.LENGTH_SHORT
        ).show();
    }

This code is working properly..

OTHER TIPS

To capture touch events other than clicks, you need to use a custom gesture detector, perhaps a subclass of your activity such as this:

private class CustomGestureListener extends GestureDetector.SimpleOnGestureListener {
    @Override       
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        boolean usedThisFling = false;

        // Is it horizontal?
        if (Math.abs(velocityX) >= 2.0*Math.abs(velocityY)) {
            if (velocityX < 0.0)     leftSwipeActions();
            else                     rightSwipeActions();
            usedThisFling = true;
        }
        return usedThisFling;
    }

Then, it needs to be instantiated and set up to be used in you onCreate() method:

// Create it.
final GestureDetector myGestureListener = new GestureDetector(getApplicationContext(), new CustomGestureListener());

// Set it up for use:
imageone.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        return myGestureListener.onTouchEvent(event);
    }
});

// And put an onClick method it to force it to work (this shouldn't be necessary but
// it seems like sometimes it is)
imageone.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    }
});
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top