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