onfling()不会因为某种原因而被调用

我试图在我的应用程序中实现手势,由于某种原因onfling()没有被调用。 我试着阅读大量关于此的post,并试图解决我的代码,但它不工作。 以下是我的代码。 请看一看:

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; } } } 

编辑:这是mainmenuslider XML文件内容的要求

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

Solutions Collecting From Web of "onfling()不会因为某种原因而被调用"

根据我的投掷是不工作的,因为滚动视图….将此代码添加到您的MainMenuSlider类。

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

我编辑了你的类的代码

  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(); } 

此代码正常工作..

要捕获点击以外的触摸事件,您需要使用自定义手势检测器,或许是您的活动的一个子类,例如:

 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; } 

然后,它需要被实例化并设置为在你的onCreate()方法中使用:

 // 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) { } });