真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

OGEngine學(xué)習(xí)筆記---事件傳遞-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)長期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為鎮(zhèn)雄企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都做網(wǎng)站,鎮(zhèn)雄網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

事件傳遞

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

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

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

  1. mScene.registerTouchArea(touchArea);

復(fù)制代碼

通過查閱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. public float[] convertLocalToSceneCoordinates(final float pX, final float pY);

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

復(fù)制代碼

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

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

屏幕事件

OnAreaTouchListener的注冊

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

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

復(fù)制代碼

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

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

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

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

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

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

預(yù)處理Flow

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

SingleTouchControler.onHandleMotionEvent():有兩個分支

* 即時觸發(fā):

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

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

mTouchEventRunnablePoolUpdateHandler.obtainPoolItem():生成事件處理對象
    事件處理對象就是在run()方法中通過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屏幕事件(遍歷注冊的TouchArea,找到合適的就調(diào)用對應(yīng)的處理監(jiān)聽器,如果沒有就調(diào)用Scene的監(jiān)聽器Scene的屏幕處理中有三個比較有意思的屬性:
  mOnAreaTouchTraversalBackToFront:事件的響應(yīng)順序是從后往前,還是調(diào)過來。默認(rèn)是從后往前
  mTouchAreaBindingEnabled:當(dāng)監(jiān)聽到ACTION_DOWN事件后是否需要綁定。綁定的意思是說到ACTION_UP或ACTION_CANCEL為止的事件全部交給這個監(jiān)聽器處理。
  mOnSceneTouchListenerBindingEnabled:和上一次差不多,這筆綁定的對象是Scene的監(jiān)聽器

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

www.ogengine.com

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


網(wǎng)站名稱:OGEngine學(xué)習(xí)筆記---事件傳遞-創(chuàng)新互聯(lián)
文章URL:http://weahome.cn/article/ceoejj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部