基本上你需要在 Activity 上调用重写 OnTouchEvent。我认为这就是你弄错的地方。这是我如何做到的一个例子。希望能帮助到你。
public class Activity1 : Activity
{
private TextView displayText;
private GestureDetector gestureScanner;
private GestureListener gestureListener;
protected override void OnCreate( Bundle bundle )
{
base.OnCreate( bundle );
SetContentView( Resource.layout.main );
displayText = FindViewById<TextView>( Resource.id.textView );
gestureListener = new GestureListener( displayText );
gestureScanner = new GestureDetector( this, gestureListener );
}
public override bool OnTouchEvent( MotionEvent e )
{
return gestureScanner.OnTouchEvent( e );
}
}
public class GestureListener : GestureDetector.IOnGestureListener
{
private readonly TextView view;
private static int SWIPE_MAX_OFF_PATH = 250;
private static int SWIPE_MIN_DISTANCE = 120;
private static int SWIPE_THRESHOLD_VELOCITY = 200;
public GestureListener( TextView view )
{
this.view = view;
}
public IntPtr Handle
{
get { throw new NotImplementedException(); }
}
public bool OnDown( MotionEvent e )
{
view.Text = "- DOWN -";
return true;
}
public bool 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( view.Context, "Left Swipe", ToastLength.Short ).Show();
else if ( e2.GetX() - e1.GetX() > SWIPE_MIN_DISTANCE && Math.Abs( velocityX ) > SWIPE_THRESHOLD_VELOCITY )
Toast.MakeText( view.Context, "Right Swipe", ToastLength.Short ).Show();
}
catch ( Exception e )
{
// nothing
}
return false;
}
public void OnLongPress( MotionEvent e )
{
view.Text = "- LONG PRESS -";
}
public bool OnScroll( MotionEvent e1, MotionEvent e2, float distanceX, float distanceY )
{
view.Text = "- FLING -";
return true;
}
public void OnShowPress( MotionEvent e )
{
view.Text = "- SHOW PRESS -";
}
public bool OnSingleTapUp( MotionEvent e )
{
view.Text = "- SINGLE TAP UP -";
return true;
}
}