123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- using System;
- using System.Collections.Generic;
- using UnityEngine;
- namespace FairyGUI
- {
- /// <summary>
- /// 手指反向操作的手势。
- /// </summary>
- public class RotationGesture : 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 rotation;
- /// <summary>
- /// 从上次通知后的改变量。
- /// </summary>
- public float delta;
- /// <summary>
- /// 是否把变化量强制为整数。默认true。
- /// </summary>
- public bool snapping;
- Vector2 _startVector;
- float _lastRotation;
- int[] _touches;
- bool _started;
- bool _touchBegan;
- public RotationGesture(GObject host)
- {
- this.host = host;
- Enable(true);
- _touches = new int[2];
- snapping = true;
- onBegin = new EventListener(this, "onRotationBegin");
- onEnd = new EventListener(this, "onRotationEnd");
- onAction = new EventListener(this, "onRotationAction");
- }
- 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]));
- _startVector = 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]));
- Vector2 vec = pt1 - pt2;
- float rot = Mathf.Rad2Deg * ((Mathf.Atan2(vec.y, vec.x) - Mathf.Atan2(_startVector.y, _startVector.x)));
- if (snapping)
- {
- rot = Mathf.Round(rot);
- if (rot == 0)
- return;
- }
- if (!_started && rot > 5)
- {
- _started = true;
- rotation = 0;
- _lastRotation = 0;
- onBegin.Call(evt);
- }
- if (_started)
- {
- delta = rot - _lastRotation;
- _lastRotation = rot;
- this.rotation += delta;
- onAction.Call(evt);
- }
- }
- void __touchEnd(EventContext context)
- {
- _touchBegan = false;
- if (_started)
- {
- _started = false;
- onEnd.Call(context.inputEvent);
- }
- }
- }
- }
|