Android - 无法在活动中触发OnTouchEvent - 使用MonoDroid(需要来自OnTouch的MotionEvent)

时间:2010-12-29 17:14:47

标签: android ontouchevent xamarin.android gesturedetector

有没有人偶然有一个使用GestureListner和Monodroid的工作示例?我似乎无法使用Java成功翻译网络上的内容。

我认为我很接近......而且我想如果我可以让这个“OnTouchEvent”开火,我可以反过来让我的GestureDetector Class'OnTouchEvent开火,然后我就可以获得滑动动作(或OnFling)。

在Activity类中触发此事件需要做什么?没有

public override bool OnTouchEvent(MotionEvent e)
{
      m_gestureDetector.OnTouchEvent(e);

      return base.OnTouchEvent(e);
}

我认为我绝对需要OnTouch事件而不是OnClick,因为我需要MotionEvent。

2 个答案:

答案 0 :(得分:4)

根据OnTouchEvent的Android文档:

  

当任何视图未处理触摸屏事件时调用   在它下面。这对处理发生的触摸事件最有用   在窗口边界之外,没有视图可以接收它。

你确定你没有在视图中处理它吗?我猜你可能在你的视图中处理它。

答案 1 :(得分:0)

基本上你需要在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;
    }
}