OGEngine學(xué)習(xí)筆記---事件傳遞

OGEngine學(xué)習(xí)筆記--- 事件傳遞

專注于為中小企業(yè)提供網(wǎng)站制作、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)肥西免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

事件傳遞

Android中的事件在表現(xiàn)形式上有很多,如onTouch、onClick和onLongClick等,在具體微觀上的表現(xiàn)形勢(shì)有action_down、action_move和action_up等。

無(wú)論哪種事件表現(xiàn)類型,首先都是基于事件的傳遞模型。其實(shí)Android中的事件傳遞有點(diǎn)類似于JS中事件傳遞模型。都是基于先捕獲然后冒泡的形式。

在OGEngine的API中,OGEngine負(fù)責(zé)捕獲觸摸事件,如果我們需要監(jiān)聽觸摸事件,則需要向Scene注冊(cè)。

  1. mScene.registerTouchArea(touchArea);

復(fù)制代碼


通過(guò)查閱ITouchArea的源碼發(fā)現(xiàn)

  1. public boolean contains(final float pX, final float pY);

  2. public float[] convertSceneToLocalCoordinates(final float pX, final float pY);

  3.                 

  4. public float[] convertLocalToSceneCoordinates(final float pX, final float pY);

  5. public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY);

復(fù)制代碼

一個(gè)區(qū)域里有自己的判斷當(dāng)前觸摸的坐標(biāo)是不是屬于自己感興趣的,如果不是則直接拋棄。 
因?yàn)镾hape類是實(shí)現(xiàn)了ITouchArea接口的,所以我們的Sprite等精靈類都可以直接被注冊(cè)。 
在Scene的源碼里可以找到相關(guān)的代碼,于是我們了解了,在Andengine中,監(jiān)聽觸摸和Entity并不是同一個(gè)概念,兩者是獨(dú)立的,于是這也解釋了,為什么在Scene中detach了一個(gè)Entity,在其注冊(cè)過(guò)監(jiān)聽的地方觸摸還是會(huì)觸發(fā)和以前一樣的效果。

再來(lái)關(guān)注事件的傳遞,在源碼中我們發(fā)現(xiàn)由于事件需要Area本身來(lái)判斷其是否屬于Area,所以在注冊(cè)的時(shí)候并不存在類似Android中的父子關(guān)系,傳遞是根據(jù)注冊(cè)的順序一個(gè)一個(gè)進(jìn)行的,但是相同的是如果一個(gè)Area宣布自己處理了時(shí)間(返回了true),傳遞序列就會(huì)直接終止,這里和Android中的事件是一樣的。 
但是這樣固定的順序會(huì)有一些問(wèn)題,其實(shí)設(shè)計(jì)者已經(jīng)考慮到了這個(gè)問(wèn)題,于是我們?cè)谠创a中發(fā)現(xiàn)了一個(gè)標(biāo)志量:mOnAreaTouchTraversalBackToFront。 這個(gè)標(biāo)志會(huì)決定當(dāng)前事件的傳遞是正序還是逆序,這樣就在一定程度上解決了我們的問(wèn)題。

屏幕事件

OnAreaTouchListener的注冊(cè)

  1. BaseGameActivity.onLoadEngine():生成引擎,設(shè)置引擎的參數(shù)

  2. BaseGameActivity.startScene():跳轉(zhuǎn)到某個(gè)場(chǎng)景中

復(fù)制代碼

其中會(huì)調(diào)用setOnTouchListener(),將Engine作為TouchListener注冊(cè)到scene中。其后所有的屏幕事件就會(huì)知道調(diào)用Engine的onTouch()方法。

屏幕事件的預(yù)處理


Android中的屏幕事件是即時(shí)突發(fā),也就是說(shuō)只要產(chǎn)生了屏幕事件就會(huì)在事件線程內(nèi)直接調(diào)用注冊(cè)監(jiān)聽器的onTouch()方法,如果處理時(shí)間過(guò)長(zhǎng),Android會(huì)直接將程序判定為無(wú)響應(yīng),并被踢出來(lái)。在OGEngine中支持兩種響應(yīng)方式

*即時(shí)觸發(fā):接受到屏幕事件后立即調(diào)用注冊(cè)的監(jiān)聽器(默認(rèn))

優(yōu)點(diǎn):和Android一樣,容易學(xué)習(xí)
缺點(diǎn):需要注意處理時(shí)間,超時(shí)的話會(huì)被判定為無(wú)響應(yīng)
         容易與OGEngine中的UpdateThread線程或描畫線程形成資源競(jìng)爭(zhēng)         
         為了避免競(jìng)合,又要做線程安全麻煩,比較復(fù)雜

*UpdateThread中觸發(fā):接受到屏幕事件后先放入池中,在UpdateThread中統(tǒng)一調(diào)用和上面的相反

預(yù)處理Flow

Engine.onTouch():判斷引擎是否運(yùn)行中,如果已停止就什么也不做,否則交給mTouchController處理。

SingleTouchControler.onHandleMotionEvent():有兩個(gè)分支

* 即時(shí)觸發(fā):

TouchEvent.obtain():生成TouchEvent
mTouchEventCallback.onTouchEvent():響應(yīng)事件(調(diào)用Engine.onTouchEven

*UpdateThread中觸發(fā):
TouchEvent.obtain():生成TouchEvent

mTouchEventRunnablePoolUpdateHandler.obtainPoolItem():生成事件處理對(duì)象
      事件處理對(duì)象就是在run()方法中通過(guò)mTouchEventCallback.onTouchEvent()響應(yīng)事件
touchEventRunnablePoolItem.set(touchEvent):設(shè)定屏幕事件
mTouchEventRunnablePoolUpdateHandler.postPoolItem:放入事件池中
Engine.onUpdate中調(diào)用mTouchController.onUpdate()執(zhí)行事件處理

屏幕事件處理


a) Engine.onTouchEvent():屏幕事件處理入口

b) Camera.convertSurfaceToSceneTouchEvent():坐標(biāo)變換

c) Engine.onTouchScene():處理Scene屏幕事件(遍歷注冊(cè)的TouchArea,找到合適的就調(diào)用對(duì)應(yīng)的處理監(jiān)聽器,如果沒有就調(diào)用Scene的監(jiān)聽器Scene的屏幕處理中有三個(gè)比較有意思的屬性:
  mOnAreaTouchTraversalBackToFront:事件的響應(yīng)順序是從后往前,還是調(diào)過(guò)來(lái)。默認(rèn)是從后往前
  mTouchAreaBindingEnabled:當(dāng)監(jiān)聽到ACTION_DOWN事件后是否需要綁定。綁定的意思是說(shuō)到ACTION_UP或ACTION_CANCEL為止的事件全部交給這個(gè)監(jiān)聽器處理。
  mOnSceneTouchListenerBindingEnabled:和上一次差不多,這筆綁定的對(duì)象是Scene的監(jiān)聽器

 http://www.eoeandroid.com/forum-863-1.html

www.ogengine.com

文章題目:OGEngine學(xué)習(xí)筆記---事件傳遞
文章源于:http://bm7419.com/article2/jdeiic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、關(guān)鍵詞優(yōu)化、網(wǎng)站導(dǎo)航品牌網(wǎng)站制作、面包屑導(dǎo)航ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)