如何在移动过程中跟踪手指的位置?

问题描述 投票:1回答:1

假设有一个ImageView(iv),我在创建一个新的GestureDetector(gs)iv.SetOnTouchListener(this)时设置了gs = new GestureDetector(this.Context, listener),我怎么能在每0.01秒内固定手指的位置(x,y)(作为例子)?

我应该使用哪种功能? OnFlingOnLongPress

我不只是谈论代码,但我也想知道如何实现这个在0.01秒内获得手指位置的愿望。有任何想法吗?

c# android xamarin ontouchlistener gesturedetector
1个回答
1
投票

您可以实现View.IOnTouchListener接口并将其作为侦听器应用于您的View(在本例中为ImageView):

View.IOnTouchListener implementation:

注意:在此示例中使用Java.Lang.Object作为基类,但您可以使用任何基于Java.Lang.Object的类(Activity等...)

public class MyTouch : Java.Lang.Object, View.IOnTouchListener
{
    TimeSpan Milli10 = TimeSpan.FromMilliseconds(10);
    DateTime oldTime;
    public bool OnTouch(View v, MotionEvent e)
    {
        switch (e.Action)
        {
            case MotionEventActions.Down:
                oldTime = DateTime.Now;
                break;
            case MotionEventActions.Move:
                if (DateTime.Now.Subtract(oldTime) > Milli10)
                {
                    Console.WriteLine($"Touch {e.RawX} : {e.RawY} : tD: {DateTime.Now.Subtract(oldTime)}");
                    oldTime = DateTime.Now;
                }
                break;
            default:
                break;
        }
        return true;
    }
}

然后,如果需要,只是实例化侦听器,并将其应用为OnTouchListener

imageView = FindViewById<ImageView>(Resource.Id.background);
touch = new MyTouch();
imageView.SetOnTouchListener(touch);

Update:

需要添加LongPress,DoubleTap等...,子类GestureDetector.SimpleOnGestureListener并将其作为内部类添加到View.IOnTouchListener实现中(这只是一种方式......)

View.IOnTouchListener PLUS SimpleOnGestureListener:

public class MyTouchPlusGestures : Java.Lang.Object, View.IOnTouchListener
{
    readonly MyGestures myGestures = new MyGestures();
    readonly TimeSpan Milli10 = TimeSpan.FromMilliseconds(10);
    readonly GestureDetector gestureDetector;
    DateTime oldTime = DateTime.Now;

    internal class MyGestures : GestureDetector.SimpleOnGestureListener
    {
        public override void OnLongPress(MotionEvent e)
        {
            // do something with press
            base.OnLongPress(e);
        }

        public override bool OnDoubleTap(MotionEvent e)
        {
            // do something with tap
            return base.OnDoubleTap(e);
        }
    }

    public MyTouchPlusGestures(View view)
    {
        gestureDetector = new GestureDetector(view.Context, myGestures);
        view.SetOnTouchListener(this);
    }

    public bool OnTouch(View v, MotionEvent e)
    {
        if (!gestureDetector.OnTouchEvent(e))
        {
            // If the event is not handled in one of your gestures, 
            // fall through to the MotionEventActions switch.
            switch (e.Action)
            {
                case MotionEventActions.Down:
                    oldTime = DateTime.Now;
                    break;
                case MotionEventActions.Move:
                    if (DateTime.Now.Subtract(oldTime) > Milli10)
                    {
                        Console.WriteLine($"Touch {e.RawX} : {e.RawY} : tD: {DateTime.Now.Subtract(oldTime)}");
                        oldTime = DateTime.Now;
                    }
                    break;
                default:
                    break;
            }
        }
        return true;
    }
}

现在只需将View传递给你的MyTouchPlusGestures实例,就会为你分配手势和触摸监听器......

imageView = FindViewById<ImageView>(Resource.Id.background);
touch = new MyTouchPlusGestures(imageView);
© www.soinside.com 2019 - 2024. All rights reserved.