private void __touchMove(EventContext context)
{
if (!_touchEffect || _owner.displayObject == null || _owner.displayObject.isDisposed)
return;
if (draggingPane != null && draggingPane != this || GObject.draggingObject != null) //已经有其他拖动
return;
InputEvent evt = context.inputEvent;
if (_touchId != evt.touchId)
return;
Vector2 pt = _owner.GlobalToLocal(new Vector2(evt.x, evt.y));
if (float.IsNaN(pt.x))
return;
int sensitivity;
if (Stage.touchScreen)
sensitivity = UIConfig.touchScrollSensitivity;
else
sensitivity = 8;
float diff;
bool sv = false, sh = false, st = false;
if (_scrollType == ScrollType.Vertical)
{
if (!_isHoldAreaDone)
{
//表示正在监测垂直方向的手势
_gestureFlag |= 1;
diff = Mathf.Abs(_holdAreaPoint.y - pt.y);
if (diff < sensitivity)
return;
if ((_gestureFlag & 2) != 0) //已经有水平方向的手势在监测,那么我们用严格的方式检查是不是按垂直方向移动,避免冲突
{
float diff2 = Mathf.Abs(_holdAreaPoint.x - pt.x);
if (diff < diff2) //不通过则不允许滚动了
return;
}
}
sv = true;
}
else if (_scrollType == ScrollType.Horizontal)
{
if (!_isHoldAreaDone)
{
_gestureFlag |= 2;
diff = Mathf.Abs(_holdAreaPoint.x - pt.x);
if (diff < sensitivity)
return;
if ((_gestureFlag & 1) != 0)
{
float diff2 = Mathf.Abs(_holdAreaPoint.y - pt.y);
if (diff < diff2)
return;
}
}
sh = true;
}
else
{
_gestureFlag = 3;
if (!_isHoldAreaDone)
{
diff = Mathf.Abs(_holdAreaPoint.y - pt.y);
if (diff < sensitivity)
{
diff = Mathf.Abs(_holdAreaPoint.x - pt.x);
if (diff < sensitivity)
return;
}
}
sv = sh = true;
}
float t = Time.time;
if (t - _time2 > 0.05f)
{
_time2 = _time1;
_time1 = t;
st = true;
}
if (sv)
{
float y = pt.y - _yOffset;
if (y > 0)
{
if (!_bouncebackEffect || _inertiaDisabled)
_container.y = 0;
else
_container.y = (int)(y * 0.5f);
}
else if (y < -_yOverlap)
{
if (!_bouncebackEffect || _inertiaDisabled)
_container.y = -(int)_yOverlap;
else
_container.y = (int)((y - _yOverlap) * 0.5f);
}
else
{
_container.y = y;
}
if (st)
{
_y2 = _y1;
_y1 = _container.y;
}
}
if (sh)
{
float x = pt.x - _xOffset;
if (x > 0)
{
if (!_bouncebackEffect || _inertiaDisabled)
_container.x = 0;
else
_container.x = (int)(x * 0.5f);
}
else if (x < 0 - _xOverlap)
{
if (!_bouncebackEffect || _inertiaDisabled)
_container.x = -(int)_xOverlap;
else
_container.x = (int)((x - _xOverlap) * 0.5f);
}
else
{
_container.x = x;
}
if (st)
{
_x2 = _x1;
_x1 = _container.x;
}
}
draggingPane = this;
_isHoldAreaDone = true;
_isMouseMoved = true;
SyncPos();
syncScrollBar();
onScroll.Call();
}