・BaseGameActivity.onLoadEngine():生成引擎
・BaseGameActivity.onSetContentView():生成View
・RenderSurfaceView.setRenderer():設定View的Renderer
其中會調用setOnTouchListener(),將Engine作爲TouchListener註冊到View中。其後所有的屏幕事件就會知道調用Engine的onTouch()方法。
2.屏幕事件的預處理
Android中的屏幕事件是即時突發,也就是說只要產生了屏幕事件就會在事件線程內直接調用註冊監聽器的onTouch()方法,如果處理時間過長,Android會直接將程序判定爲無響應,並被踢出來。在andengine中支持兩種響應方式
☆即時觸發:接受到屏幕事件後立即調用註冊的監聽器(默認)
優點:和Android一樣,容易學習
缺點:・需要注意處理時間,超時的話會被判定爲無響應
・容易與andengine中的UpdateThread線程或描畫線程形成資源競合
・爲了避免競合,又要做線程安全麻煩,複雜
☆UpdateThread中觸發:接受到屏幕事件後先放入池中,在UpdateThread中統一調用
和上面的相反
預處理Flow
・Engine.onTouch():判斷引擎是否運行中,如果已停止就什麼也不做,否則交給mTouchController處理。
・SingleTouchControler.onHandleMotionEvent():有兩個分支
☆即時觸發:
・TouchEvent.obtain():生成TouchEvent
・mTouchEventCallback.onTouchEvent():響應事件(調用Engine.onTouchEvent)
☆UpdateThread中觸發:
・TouchEvent.obtain():生成TouchEvent
・mTouchEventRunnablePoolUpdateHandler.obtainPoolItem():生成事件處理對象
事件處理對象就是在run()方法中通過mTouchEventCallback.onTouchEvent()響應事件
・touchEventRunnablePoolItem.set(touchEvent):設定屏幕事件
・mTouchEventRunnablePoolUpdateHandler.postPoolItem:放入事件池中
・Engine.onUpdate中調用mTouchController.onUpdate()執行事件處理
3、屏幕事件處理
・Engine.onTouchEvent():屏幕事件處理入口
・Camera.convertSurfaceToSceneTouchEvent():座標變換
・Engine.onTouchHUD():優先處理HUD屏幕事件
HUD其實是Scene的子類,在這裏它只會作一次座標變換,然後交給父類Scene處理
・Engine.onTouchScene():處理Scene屏幕事件
遍歷註冊的TouchArea,找到合適的就調用對應的處理監聽器,如果沒有就調用Scene的監聽器
Scene的屏幕處理中有三個比較有意思的屬性:
・mOnAreaTouchTraversalBackToFront:事件的響應順序是從後往前,還是調過來。默認是從後往前
・mTouchAreaBindingEnabled:當監聽到ACTION_DOWN事件後是否需要綁定。綁定的意思是說到ACTION_UP或ACTION_CANCEL爲止的事件全部交給這個監聽器處理。
・mOnSceneTouchListenerBindingEnabled:和上一次差不多,這筆綁定的對象是Scene的監聽器
4、MultiTouchContrller
・ACTION_MOVE中包含所有正在觸摸點的信息,所以需要處理所有點的信息。各個觸摸點通過PointerID來區分
・其他類型的事件中只包含單點的信息,所以直接處理