Как отследить местоположение пальца во время движения? - PullRequest
1 голос
/ 29 апреля 2019

Предположим, что существует ImageView (iv), и я установил iv.SetOnTouchListener(this) при создании нового GestureDetector (gs) gs = new GestureDetector(this.Context, listener), как я могу указать местоположение пальца (x, y) каждые 0,01 секунды (как пример)?

Какую функцию я должен использовать? OnFling? OnLongPress

Я говорю не только о коде, но я также хотел бы получить представление о том, как реализовать это желание получать положение пальца каждые 0,01 секунды. Есть идеи?

1 Ответ

1 голос
/ 29 апреля 2019

Вы можете реализовать интерфейс View.IOnTouchListener и применить его в качестве прослушивателя к своему представлению (в данном случае ImageView):

Реализация View.IOnTouchListener:

Примечание: Использование 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);

Обновление:

Необходимо добавить 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);
...