1.OnTouchListener的注册
・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来区分
・其他类型的事件中只包含单点的信息,所以直接处理
・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来区分
・其他类型的事件中只包含单点的信息,所以直接处理