Android - не удается запустить OnTouchEvent в Activity - с помощью MonoDroid (требуется MotionEvent от OnTouch) - PullRequest
1 голос
/ 29 декабря 2010

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

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

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

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

      return base.OnTouchEvent(e);
}

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

Ответы [ 2 ]

4 голосов
/ 04 января 2011

Согласно документации Android для OnTouchEvent :

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

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

0 голосов
/ 07 января 2011

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