1

偶然、Monodroid で GestureListner を使用する実際の例を誰かが持っているでしょうか? Java を使用して、ネット上にあるものをうまく翻訳できないようです。

私は近いと思います...そして、この「OnTouchEvent」を起動できれば、GestureDetectorクラスのOnTouchEventを起動でき、スワイプモーション(またはOnFling)を取得できると思います.

Activity クラスでこのイベントを発生させるにはどうすればよいですか? いいえ

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

      return base.OnTouchEvent(e);
}

そして、MotionEvent が必要なので、OnClick ではなく OnTouch イベントが絶対に必要だと思います。

4

2 に答える 2

5

OnTouchEventの Android ドキュメントによると:

タッチ スクリーン イベントがその下のビューのいずれによっても処理されなかった場合に呼び出されます。これは、ウィンドウの境界の外で発生したタッチ イベントを処理する場合に最も便利です。この場合、それを受け取るビューはありません。

あなたはそれをビューで扱っていませんか?私の推測では、おそらくあなたの見解でそれを処理する必要があります。

于 2011-01-04T01:54:39.390 に答える
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;
    }
}
于 2011-01-07T02:39:51.367 に答える