40.FGUI基础-Unity中的使用必备-事件机制
40.1 知识点
事件触发时的传递机制
- 举例说明
- GRoot——>面板——>A——>B——>C
- 当C触发一个事件时,比如TouchBegin
- 该事件的触发会依次往上向父对象进行传递
- C——>B——>A——>面板——>GRoot
- 它的事件触发的先后顺序也是如此
- 这种传递过程叫做冒泡传递机制
如果你想打断冒泡传递,可以通过监听函数中的 EventContext 参数中的 StopPropagation 方法进行打断:
TeachPanel panel = UIManager.Instance.ShowPanel<TeachPanel>("Teach");
panel.m_btnTest.onTouchBegin.Add(() =>
{
print("按钮按下");
});
panel.onTouchBegin.Add((contextData) =>
{
print("面板按下");
contextData.StopPropagation();
// 打断了事件传递 GRoot 按下不会执行
});
GRoot.inst.onTouchBegin.Add(() =>
{
print("GRoot 按下");
});
事件监听的两种委托
- 无参委托 EventCallback0
- 有参委托 EventCallback1 有 EventContext 参数
panel.m_btnTest.onRollOut.Add(OutTest);
panel.m_btnTest.onRollOut.Remove(OutTest);
// 如果通过lamda表达式或者匿名函数添加,那么只能加没办法指定移除
panel.m_btnTest.onRollOut.Add(() =>
{
});
private void OutTest(EventContext data)
{
data.StopPropagation();
}
有参委托的 EventContext 参数
- sender 获得事件的分发者
- initiator 获得事件的发起者 (DisplayObject 原生对象)
- type 事件类型
- inputEvent 如果事件是键盘/触摸/鼠标事件,通过访问 inputEvent 对象可以获得这类事件的相关数据
- x y 鼠标或手指的位置(物理坐标,需要 GlobalToLocal 转换)
- keyCode 按键代码
- mouseWheelDelta 鼠标滚轮滚动值
- touchId 当前事件相关的手指 ID
- isDoubleClick 是否双击
- data 事件的数据。根据事件不同,可以有不同的含义
- StopPropagation 停止冒泡传递
- CaptureTouch 事件捕获。上层的事件捕获会传递给下层。在 TouchBegin 调用该方法,可以让 TouchEnd 在对象外部也能触发
- PreventDefault、UncaptureTouch 取消 CaptureTouch 发起的触摸事件捕获
40.2 知识点代码
using FairyGUI;
using System.Collections;
using System.Collections.Generic;
using Teach;
using UnityEngine;
public class Lesson40_FGUI基础_Unity中的使用必备_事件机制 : MonoBehaviour
{
void Start()
{
#region 知识点一 事件触发时的传递机制
//举例说明
//GRoot——>面板——>A——>B——>C
//当C触发一个事件时,比如TouchBegin
//该事件的触发会依次往上向父对象进行传递
//C——>B——>A——>面板——>GRoot
//它的事件触发的先后顺序也是如此
//这种传递过程叫做冒泡传递机制
//如果你想打断冒泡传递
//可以通过 监听函数中的 EventContext参数中的
//StopPropagation方法 进行打断
TeachPanel panel = UIManager.Instance.ShowPanel<TeachPanel>("Teach");
panel.m_btnTest.onTouchBegin.Add(() =>
{
print("按钮按下");
});
panel.onTouchBegin.Add((contextData) =>
{
print("面板按下");
contextData.StopPropagation();
//打断了事件传递 GRoot按下不会执行
});
GRoot.inst.onTouchBegin.Add(() =>
{
print("GRoot按下");
});
#endregion
#region 知识点二 事件监听的两种委托
//无参委托 EventCallback0
//有参委托 EventCallback1 有EventContext参数
panel.m_btnTest.onRollOut.Add(OutTest);
panel.m_btnTest.onRollOut.Remove(OutTest);
//如果通过那么大表达式或者匿名函数添加 那么只能加没办法指定移除
panel.m_btnTest.onRollOut.Add(() =>
{
});
#endregion
#region 知识点三 有参委托的EventContext参数
//sender 获得事件的分发者
//initiator 获得事件的发起者(DisplayObject原生对象)
//type 事件类型
//inputEvent 如果事件是键盘/触摸/鼠标事件,通过访问inputEvent对象可以获得这类事件的相关数据
//x y 鼠标或手指的位置(物理坐标,需要GlobalToLocal转换)
//keyCode 按键代码
//mouseWheelDelta 鼠标滚轮滚动值
//touchId 当前事件相关的手指ID
//isDoubleClick 是否双击
//data 事件的数据。根据事件不同,可以有不同的含义
//StopPropagation 停止冒泡传递
//CaptureTouch 事件捕获 上层的事件捕获会传递给下层 在TouchBegin调用该方法,可以让TouchEnd在对象外部也能触发
//PreventDefault UncaptureTouch 取消CaptureTouch发起的触摸事件捕获
#endregion
}
private void OutTest(EventContext data)
{
data.StopPropagation();
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com