157 lines
4.5 KiB
C#
157 lines
4.5 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|