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

1

Кто-нибудь случайно найдет рабочий пример использования 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.

Теги:
xamarin.android
ontouchevent
gesturedetector

2 ответа

4

В соответствии с документами Android для OnTouchEvent:

Вызывается, когда событие с сенсорным экраном не обрабатывается ни одним из представлений под ним. Это наиболее полезно для обработки событий касания, которые происходят вне границ вашего окна, где нет представления для его получения.

Вы уверены, что не обрабатываете его в представлении? Я предполагаю, что вы, вероятно, должны справиться с этим в своем представлении.

0

В основном вам нужно вызвать переопределение 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;
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню