Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

onfling() not being called for some reason

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>
like image 394
Azhar92 Avatar asked Jul 24 '13 09:07

Azhar92


2 Answers

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..

like image 64
Abhishek Agarwal Avatar answered Oct 31 '22 16:10

Abhishek Agarwal


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) {
    }
});
like image 1
Neil Townsend Avatar answered Oct 31 '22 17:10

Neil Townsend