| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 | using System;using System.Collections.Generic;using UnityEngine;namespace FairyGUI{    /// <summary>    /// 两个指头捏或者放的手势。    /// </summary>    public class PinchGesture : EventDispatcher    {        /// <summary>        ///         /// </summary>        public GObject host { get; private set; }        /// <summary>        /// 当两个手指开始呈捏手势时派发该事件。        /// </summary>        public EventListener onBegin { get; private set; }        /// <summary>        /// 当其中一个手指离开屏幕时派发该事件。        /// </summary>        public EventListener onEnd { get; private set; }        /// <summary>        /// 当手势动作时派发该事件。        /// </summary>        public EventListener onAction { get; private set; }        /// <summary>        /// 总共缩放的量。        /// </summary>        public float scale;        /// <summary>        /// 从上次通知后的改变量。        /// </summary>        public float delta;        float _startDistance;        float _lastScale;        int[] _touches;        bool _started;        bool _touchBegan;        public PinchGesture(GObject host)        {            this.host = host;            Enable(true);            _touches = new int[2];            onBegin = new EventListener(this, "onPinchBegin");            onEnd = new EventListener(this, "onPinchEnd");            onAction = new EventListener(this, "onPinchAction");        }        public void Dispose()        {            Enable(false);            host = null;        }        public void Enable(bool value)        {            if (value)            {                if (host == GRoot.inst)                {                    Stage.inst.onTouchBegin.Add(__touchBegin);                    Stage.inst.onTouchMove.Add(__touchMove);                    Stage.inst.onTouchEnd.Add(__touchEnd);                }                else                {                    host.onTouchBegin.Add(__touchBegin);                    host.onTouchMove.Add(__touchMove);                    host.onTouchEnd.Add(__touchEnd);                }            }            else            {                _started = false;                _touchBegan = false;                if (host == GRoot.inst)                {                    Stage.inst.onTouchBegin.Remove(__touchBegin);                    Stage.inst.onTouchMove.Remove(__touchMove);                    Stage.inst.onTouchEnd.Remove(__touchEnd);                }                else                {                    host.onTouchBegin.Remove(__touchBegin);                    host.onTouchMove.Remove(__touchMove);                    host.onTouchEnd.Remove(__touchEnd);                }            }        }        void __touchBegin(EventContext context)        {            if (Stage.inst.touchCount == 2)            {                if (!_started && !_touchBegan)                {                    _touchBegan = true;                    Stage.inst.GetAllTouch(_touches);                    Vector2 pt1 = host.GlobalToLocal(Stage.inst.GetTouchPosition(_touches[0]));                    Vector2 pt2 = host.GlobalToLocal(Stage.inst.GetTouchPosition(_touches[1]));                    _startDistance = Vector2.Distance(pt1, pt2);                    context.CaptureTouch();                }            }        }        void __touchMove(EventContext context)        {            if (!_touchBegan || Stage.inst.touchCount != 2)                return;            InputEvent evt = context.inputEvent;            Vector2 pt1 = host.GlobalToLocal(Stage.inst.GetTouchPosition(_touches[0]));            Vector2 pt2 = host.GlobalToLocal(Stage.inst.GetTouchPosition(_touches[1]));            float dist = Vector2.Distance(pt1, pt2);            if (!_started && Mathf.Abs(dist - _startDistance) > UIConfig.touchDragSensitivity)            {                _started = true;                scale = 1;                _lastScale = 1;                onBegin.Call(evt);            }            if (_started)            {                float ss = dist / _startDistance;                delta = ss - _lastScale;                _lastScale = ss;                this.scale += delta;                onAction.Call(evt);            }        }        void __touchEnd(EventContext context)        {            _touchBegan = false;            if (_started)            {                _started = false;                onEnd.Call(context.inputEvent);            }        }    }}
 |