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);
- }
- }
- }
- }
|