Android — не удается запустить OnTouchEvent в Activity — с помощью MonoDroid (нужен MotionEvent от OnTouch)

Может быть, у кого-нибудь есть рабочий пример использования GestureListner с Monodroid? Кажется, я не могу успешно перевести то, что есть в сети, с помощью Java.

Я думаю, что я близок... И я думаю, что если я смогу запустить этот "OnTouchEvent", я мог бы, в свою очередь, запустить OnTouchEvent моего класса GestureDetector, а затем я смог бы получить движение смахивания (или OnFling) .

Что мне нужно сделать, чтобы это событие сработало в моем классе Activity? Нет

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

      return base.OnTouchEvent(e);
}

И я думаю, что мне определенно нужно событие OnTouch вместо OnClick, потому что мне нужно MotionEvent.


person D Lyonnais    schedule 29.12.2010    source источник


Ответы (2)



В основном вам нужно вызвать переопределение OnTouchEvent в Activity. Я думаю, что это то, где вы ошиблись. Вот пример того, как я это сделал. Надеюсь, поможет.

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;
    }
}
person leonardo    schedule 07.01.2011