Страница 1 из 1

Реализация одновременно свапа двумя пальцами и зуума

СообщениеДобавлено: 20 сен 2017, 22:36
Susanin
Собственно говоря что-то не получается корректно различить где свап, а где зуум.
Может кто уже реализовывал нечто подобное?


З.Ы. И её маё - это только у меня Заголовок: наезжает на Значок: при создании темы?

Re: Реализация одновременно свапа двумя пальцами и зуума

СообщениеДобавлено: 20 сен 2017, 23:24
Tolking
Свайп - изменение положения середины между тачами.
Зум - растояние между тачами.

Re: Реализация одновременно свапа двумя пальцами и зуума

СообщениеДобавлено: 23 сен 2017, 13:31
Susanin
Tolking писал(а):Свайп - изменение положения середины между тачами.
Зум - растояние между тачами.

Спасибо кэп!

Меня интересует рабочий вариант их одновременной реализации, что бы без конфликтов, ибо программа не может понять где граница между свапом и зуумом.

Re: Реализация одновременно свапа двумя пальцами и зуума

СообщениеДобавлено: 24 сен 2017, 10:48
Левш@
Дык свайп - это один тач, а зум как минимум два, не ?

Re: Реализация одновременно свапа двумя пальцами и зуума

СообщениеДобавлено: 27 сен 2017, 00:18
Susanin
Левш@ писал(а):Дык свайп - это один тач, а зум как минимум два, не ?


нет - меня именно интересует реализация свапа двумя пальцами и зума (свап одним уже задействован).
Не могу подобрать критерий по которому программа бы распознала где начинается свап, а где зумм...

Re: Реализация одновременно свапа двумя пальцами и зуума

СообщениеДобавлено: 27 сен 2017, 10:23
Левш@
Ну тогда вам уже правильно написали выше:
Свайп - изменение положения середины между тачами.
Зум - растояние между тачами.

Re: Реализация одновременно свапа двумя пальцами и зуума

СообщениеДобавлено: 27 сен 2017, 11:03
IDoNotExist

Re: Реализация одновременно свапа двумя пальцами и зуума

СообщениеДобавлено: 27 сен 2017, 23:07
Susanin

Эээх - где вы были раньше с этим ассетом?

Сейчас мне уже проще самому такую программу написать нежели в чужой разбираться.

И да, я так не обнаружил в примерах мой случай. Может плохо искал?


Левш@ писал(а):Ну тогда вам уже правильно написали выше:
Свайп - изменение положения середины между тачами.
Зум - растояние между тачами.


Нет - тут нет ответа на вопрос как их различить.
Вот часть кода отвечающая за обработку касания двумя пальцами:
(определение того что сейчас зумм или свап определяется изменением расстояния между пальцами
на критическую величину zoomshift: if (Math.Abs(tap2FingerCurrentZoom - tap2FingerStartZoom) < zoomShift)
Как вы понимаете код работает некорректно и я спрашиваю сталкивался ли кто с подобной реализацией.
Синтаксис:
Используется csharp
       
            if (finger2 && Input.touchCount == 2)
            {
                touch = Input.touches[0];
                touch1 = Input.touches[1];
                if (touch1.phase == TouchPhase.Began)
                {
                    tap2FingerStartPos = (touch.position + touch1.position) * 0.5f;
                    tap2FingerStartZoom = Vector2.Distance(touch.position, touch1.position);
                    Messenger<Vector2>.Broadcast(EVENTS.TapStart2Finger, tap2FingerStartPos);
                }

                if (touch.phase == TouchPhase.Moved || touch1.phase == TouchPhase.Moved)
                {
                    tap2FingerCurrentZoom = Vector2.Distance(touch.position, touch1.position);
                    tap2FingerCurrentPosition = (touch.position + touch1.position) * 0.5f;

                    if (Math.Abs(tap2FingerCurrentZoom - tap2FingerStartZoom) < zoomShift)
                    {
                        if (is1FingerWasActive || is3FingerWasActive)
                        {
                            tap2FingerStartPos = (touch.position + touch1.position) * 0.5f;
                            tap2FingerStartZoom = Vector2.Distance(touch.position, touch1.position); ResetFingers();
                        }
                        displasement2Finger = (touch.deltaPosition + touch1.deltaPosition) * 0.5f;
                        if (Mathf.Abs(displasement2Finger.y) < Mathf.Abs(displasement2Finger.x))
                        {
                            if (is2FingerWasVertical || is2FingerWasZoom)
                            {
                                tap2FingerStartPos = (touch.position + touch1.position) * 0.5f;
                                tap2FingerStartZoom = Vector2.Distance(touch.position, touch1.position);
                                ResetFingers();
                            }
                            else if (finger2Horizontal)
                            {
                                displasement2Finger.y = 0;
                                Messenger<Vector2>.Broadcast(EVENTS.TapHorisontalMove2Finger, displasement2Finger);
                                is2FingerWasHorizontal = true;
                            }
                        }
                        else
                        {
                            if (is2FingerWasHorizontal || is2FingerWasZoom)
                            {
                                tap2FingerStartPos = (touch.position + touch1.position) * 0.5f;
                                tap2FingerStartZoom = Vector2.Distance(touch.position, touch1.position);
                                ResetFingers();
                            }
                            else if (finger2Vertical)
                            {
                                displasement2Finger.x = 0;
                                Messenger<Vector2>.Broadcast(EVENTS.TapVerticalMove2Finger, displasement2Finger);
                                is2FingerWasVertical = true;
                            }
                        }

                    }
                    if (finger2Zoom && Math.Abs(tap2FingerCurrentZoom - tap2FingerStartZoom) > zoomShift)
                    {
                        if (is2FingerWasVertical || is2FingerWasHorizontal)
                        {
                            tap2FingerStartPos = (touch.position + touch1.position) * 0.5f;
                            tap2FingerStartZoom = Vector2.Distance(touch.position, touch1.position);
                            ResetFingers();
                        }
                        float disp = Math.Abs(touch.deltaPosition.magnitude) + Math.Abs(touch1.deltaPosition.magnitude);
                        Messenger<float>.Broadcast(EVENTS.Tap2FingerZOOM, disp * 0.001f);
                        //tap2FingerStartZoom = tap2FingerCurrentZoom;
                        is2FingerWasZoom = true;
                    }

                }
            }
        }

 

Re: Реализация одновременно свапа двумя пальцами и зуума

СообщениеДобавлено: 28 сен 2017, 11:03
bojlahg
Замерять расстояние между тачами и расстояние средней точки между тачами. Когда одно из значений перейдет определенную границу то соответственно переключаться на его обработку. Причем логично сделать перевод пикселей в дюймы через DPI чтобы на разных устройствах паботало одинаково.

Re: Реализация одновременно свапа двумя пальцами и зуума

СообщениеДобавлено: 28 сен 2017, 17:35
Susanin
bojlahg писал(а):Замерять расстояние между тачами и расстояние средней точки между тачами. Когда одно из значений перейдет определенную границу то соответственно переключаться на его обработку. Причем логично сделать перевод пикселей в дюймы через DPI чтобы на разных устройствах паботало одинаково.

Если поставить два таких условия - то постоянно будет возникать ситуация, когда одновременно активируется и свап и зумм.

Возможно как критерий стоит взять отношение их относительных изменений...