40.事件机制

  1. 40.FGUI基础-Unity中的使用必备-事件机制
    1. 40.1 知识点
      1. 事件触发时的传递机制
      2. 事件监听的两种委托
      3. 有参委托的 EventContext 参数
    2. 40.2 知识点代码

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

×

喜欢就点赞,疼爱就打赏