赞
踩
在Android NDK系列(一)手动搭建Native Project 创建的Native工程中,是可以接收输入事件的,只需在android_main中注册输入事件的处理函数,当触摸屏幕后,handleInputEvent函数便会调用,代码如下。
- static int32_t handleInputEvent(struct android_app* app, AInputEvent* event)
- {
- LOGI("android_main handleInputEvent");
- if(AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION
- && AInputEvent_getSource(event) == AINPUT_SOURCE_TOUCHSCREEN){
- int32_t action = AMotionEvent_getAction(event);
- float x = AMotionEvent_getX(event,0);
- float y = AMotionEvent_getY(event,0);
- switch(action){
- case AMOTION_EVENT_ACTION_DOWN:
- LOGI("android_main AMOTION_EVENT_ACTION_DOWN (x %f, y %f)", x,y);
- break;
- case AMOTION_EVENT_ACTION_MOVE:
- LOGI("android_main AMOTION_EVENT_ACTION_MOVE");
- break;
- case AMOTION_EVENT_ACTION_UP:
- LOGI("android_main AMOTION_EVENT_ACTION_UP");
- break;
- default:
- break;
- }
- }
-
- return 0;
- }
-
- void android_main(struct android_app* app)
- {
- app->onInputEvent = handleInputEvent;
- }
本文主要介绍触摸事件是如何传递过来的,主要分为以下两个部分。
要收到输入事件,首先要创建输入队列,ViewRootImpl在处理setView请求时开始创建输入队列,代码如下。
- public final class ViewRootImpl implements ViewParent,
- View.AttachInfo.Callbacks, ThreadedRenderer.DrawCallbacks,
- AttachedSurfaceControl {
- public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView,
- int userId) {
- if (mInputQueueCallback != null) {
- mInputQueue = new InputQueue();
- mInputQueueCallback.onInputQueueCreated(mInputQueue);
- }
- }
- }
- public final class InputQueue {
- public InputQueue() {
- mPtr =
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。