ugui动态绑定事件

也许你也跟我一样。喜欢直接这样拖拽。绑定事件

但实际项目中是不这样的。因为很多对象都是动态添加的。然后动态绑定事件。这样才够灵活。所以收集了下面的代码:

 1 using UnityEngine;
 2 using System.Collections;
 3 using UnityEngine.EventSystems;
 4
 5 public class EventClickListener : MonoBehaviour,IPointerClickHandler,IPointerDownHandler,IPointerUpHandler
 6 {
 7     public delegate void VoidDelegate(GameObject go);
 8     public VoidDelegate onClick;
 9     public VoidDelegate onDown;
10     public VoidDelegate onUp;
11     public VoidDelegate onLongClick; // 长按事件
12
13     public object parameter;
14     public object parameterLong;
15     public byte testLongClickFlag = 0; // 用于长按检测,当长按过程中同时进行了拖动,我们将取消长按事件 0:未进行长按检测或长按已经取消 1:正在检测 2:长按已触发
16
17     static public EventClickListener Get(GameObject go)
18     {
19         EventClickListener listener = go.GetComponent<EventClickListener>();
20         if (listener == null) listener = go.AddComponent<EventClickListener>();
21         return listener;
22     }
23
24     public void OnPointerClick(PointerEventData eventData)
25     {
26         if (testLongClickFlag == 2) return; // 长按已经触发,则取消单击事件
27         if (onClick != null) onClick(gameObject);
28     }
29
30     public void OnPointerDown(PointerEventData eventData)
31     {
32         if (onDown != null) onDown(gameObject);
33         if (onLongClick != null)
34         {
35             testLongClickFlag = 1;
36             Invoke("LongClickFunc", 0.5f); // 长按0.5秒钟
37         }
38     }
39
40     public void OnPointerUp(PointerEventData eventData)
41     {
42         if (onUp != null) onUp(gameObject);
43         if (testLongClickFlag == 1)
44         {
45             testLongClickFlag = 0;
46             CancelInvoke("LongClickFunc");
47         }
48     }
49
50     private void LongClickFunc()
51     {
52         testLongClickFlag = 2;
53         if (onLongClick != null) onLongClick(gameObject);
54     }
55 }

第一种。继承相应的接口实现

 1 using UnityEngine;
 2 using System.Collections;
 3 using UnityEngine.EventSystems;
 4
 5 public class EventTriggerListener : UnityEngine.EventSystems.EventTrigger
 6 {
 7     public delegate void VoidDelegate_New(GameObject go, PointerEventData eventData);
 8     public delegate void VoidDelegate(GameObject go);
 9     public VoidDelegate onClick;
10     public VoidDelegate_New onDrag;
11     public VoidDelegate_New onBeginDrag;
12     public VoidDelegate_New onEndDrag;
13     public VoidDelegate_New onDown;
14     public VoidDelegate onEnter;
15     public VoidDelegate onExit;
16     public VoidDelegate_New onUp;
17     public VoidDelegate onSelect;
18     public VoidDelegate onUpdateSelect;
19     public VoidDelegate onLongClick; // 长按事件
20
21     public object parameter;
22     public byte testLongClickFlag = 0; // 用于长按检测,当长按过程中同时进行了拖动,我们将取消长按事件 0:未进行长按检测或长按已经取消 1:正在检测 2:长按已触发
23
24     static public EventTriggerListener Get(GameObject go)
25     {
26         EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
27         if (listener == null) listener = go.AddComponent<EventTriggerListener>();
28         return listener;
29     }
30     public override void OnPointerClick(PointerEventData eventData)
31     {
32         if (testLongClickFlag == 2) return; // 长按已经触发,则取消单击事件
33         if (onClick != null) onClick(gameObject);
34     }
35     public override void OnPointerDown(PointerEventData eventData)
36     {
37         if (onDown != null) onDown(gameObject, eventData);
38         if (onLongClick != null)
39         {
40             testLongClickFlag = 1;
41             Invoke("LongClickFunc", 0.5f); // 长按0.5秒钟
42         }
43     }
44     private void LongClickFunc()
45     {
46         testLongClickFlag = 2;
47         if (onLongClick != null) onLongClick(gameObject);
48     }
49     public override void OnPointerUp(PointerEventData eventData)
50     {
51         if (onUp != null) onUp(gameObject, eventData);
52         if (testLongClickFlag == 1)
53         {
54             testLongClickFlag = 0;
55             CancelInvoke("LongClickFunc");
56         }
57     }
58     public override void OnPointerEnter(PointerEventData eventData)
59     {
60         if (onEnter != null) onEnter(gameObject);
61     }
62     public override void OnPointerExit(PointerEventData eventData)
63     {
64         if (onExit != null) onExit(gameObject);
65     }
66     public override void OnSelect(BaseEventData eventData)
67     {
68         if (onSelect != null) onSelect(gameObject);
69     }
70     public override void OnUpdateSelected(BaseEventData eventData)
71     {
72         if (onUpdateSelect != null) onUpdateSelect(gameObject);
73     }
74     public override void OnDrag(PointerEventData eventData)
75     {
76         //Core.Log.Trace("OnEndDrag: " + eventData.pressPosition.x + "," + eventData.position.x);
77         if (onDrag != null) onDrag(gameObject, eventData);
78         if (testLongClickFlag == 1)
79         {
80             float dx = Mathf.Abs(eventData.position.x - eventData.pressPosition.x);
81             float dy = Mathf.Abs(eventData.position.y - eventData.pressPosition.y);
82             if (dx > 5 || dy > 5) // 如果只是手指抖动,我们不当拖动处理
83             {
84                 testLongClickFlag = 0;
85                 CancelInvoke("LongClickFunc");
86             }
87         }
88     }
89     public override void OnBeginDrag(PointerEventData eventData)
90     {
91         if (onBeginDrag != null) onBeginDrag(gameObject, eventData);
92     }
93     public override void OnEndDrag(PointerEventData eventData)
94     {
95         if (onEndDrag != null) onEndDrag(gameObject, eventData);
96     }
97 }

第二种。继承EventTrigger实现

实际上EventTrigger是继承至IPointerUpHandler接口

1    GameObject message = this.Find("Message").gameObject;//对象
2    EventClickListener.Get(tab).parameter = index;//额外的参数
3    EventClickListener.Get(tab).onClick = DownChangeTab;//回调方法

调用

时间: 2024-10-06 00:28:02

ugui动态绑定事件的相关文章

设置获得的标签体、动态绑定事件以及Ajax

前言 主要谈谈Ajax以及jQuery对Ajax的支持 Ajax(Asynchronous javascript  and xml)以异步地方式实现局部HTML的刷新.创建交互式web应用程序而无需牺牲浏览器兼容性的流行方法. 正文 设置获得的标签体 动态绑定事件 方式一 方式二 例子 Ajax 1.Ajax是一种在2005年由Google推广开来的编程模式,是一种使用现有标准的新方法通过Ajax,可以创建更好.更快以及更友好的web应用程序. 2.Ajax基于javascript和HTTP请求

UGUI按钮事件获取触发按钮自身组件

UGUI按钮事件中往往出现N个按钮同时调用同一个按钮事件函数的情况,然而当按钮比较多的情况下点击触发后要获取该按钮的属性中的组件内容时应该这么操作: 1,首先在按钮属性中添加一个点击事件: 2,把写好的public触发事件绑定的对象拖到指定位置,并选择所写的函数名: 3,到这里是关键了,如何获取按钮触发时所触发的对象呢?其实很简答, 就是触发时在函数中传递参数,而这个参数是按钮本身即可: public void BusineseTypeButtonBnt(GameObject sender) {

javascript与jquery动态绑定事件需要先加载页面注意的坑

1.javascript的Dom对象动态事件绑定注意以下2点,如:document.getElementById("id名称").addListenerEvent("事件名称",function(){代码},false),动态绑定事件,事件名称不加on,如:click,mouseover等. (1)如果<script>绑定代码</script>写在<body>html代码</body>前面,则必须先使用加载页面语句wi

jquery json遍历和动态绑定事件

<div id='tmpselectorList' style='border: 1px solid grey;max-height: 150px;position:absolute;text-align: left; overflow: auto;background:white;width:153px;'> </div> <script type="text/javascript"> $(document).ready(function () {

UGUI事件系统——事件数据

事件数据 - EventData BaseEventData:基础事件数据 -事件数据的基类,和EventSystem配合使用 PointerEventData:指针事件数据 -鼠标与触摸事件的相关数据(点击.抬起.拖动等),UGUI中大部分事件数据类型都是PointerEventData类型 button:该属性有3个取值.分别是Left(鼠标左键).Right(鼠标右键).Middle(鼠标中键) clickCount:连续点击的次数 clickTime:发送点击事件的时间 delta:当前

【JQ】jq动态绑定事件.on()、解绑事件off()

#JQ 绑定与解绑事件的方法的历史演变 1. jquery1.4 及之前的版本,由.click() 或 .bind()方法绑定的事件,不能适用脚本创建的新元素:即是说页面加载完成后,再动态创建的DOM元素并不能响应之前绑定的事件!解绑事件使用.unbind()方法: 旧版本的处理方法是使用.live()方法来代替事件绑定.bind(),使得绑定的事件能适用脚本创建的新元素,从而实现事件的动态绑定:解绑事件使用.unlive()方法: 1 <html> 2 <head> 3 <

Jquery on() 动态绑定事件

之前就一直受这个问题的困扰,在jQuery1.7版本之后添加了on方法,之前就了解过,其优越性高于live(),bind(),delegate()等方法,在此之前项目中想用这个来测试结果发现,居然动态生成的标签点击了没反应,而live方法却能够支持: jQuery 使用on绑定动态生成的元素时,不能直接用该对象操作,而是选择其非动态生成的父节点然后再找到本身才能达到效果. $("#table").on("click","a",function()

UGUI事件系统——事件触发

被动触发:满足条件后自动触发(比如鼠标点击后,自动触发点击事件) 被动触发的事件系统: EventSystem 负责调度处理事件的输入.射线和发送事件消息 First Selected:默认选中的游戏对象 Send Navigation Events:是否发送导航事件(是否可以用键盘方向键控制事件) Drag Threshold:在范围内拖动n像素,才能触发拖动事件 Standalone Input Module 电脑输入模式(鼠标键盘.游戏手柄等) Touch Input Module 触摸输

UGUI事件系统——事件接口

所有的事件接口均继承自 IEventSystemHandler IPointerEnterHandler 指针进入事件 IPointerExitHandler  指针退出事件 --利用指针进入.退出事件,可以完成ToolTip功能 IPointerDownHandler 指针按下事件:在可视元素矩形区域内按下时响应 IPointerUpHandler    指针抬起事件:在可视元素矩形区域内按下后,在任意地方抬起时响应 IPointerClickHandler 指针点击事件:在可视元素矩形区域内