当前位置:   article > 正文

Android NDK系列(三)输入事件分发到Native层的流程

Android NDK系列(三)输入事件分发到Native层的流程

 在Android NDK系列(一)手动搭建Native Project 创建的Native工程中,是可以接收输入事件的,只需在android_main中注册输入事件的处理函数,当触摸屏幕后,handleInputEvent函数便会调用,代码如下。

  1. static int32_t handleInputEvent(struct android_app* app, AInputEvent* event)
  2. {
  3. LOGI("android_main handleInputEvent");
  4. if(AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION
  5. && AInputEvent_getSource(event) == AINPUT_SOURCE_TOUCHSCREEN){
  6. int32_t action = AMotionEvent_getAction(event);
  7. float x = AMotionEvent_getX(event,0);
  8. float y = AMotionEvent_getY(event,0);
  9. switch(action){
  10. case AMOTION_EVENT_ACTION_DOWN:
  11. LOGI("android_main AMOTION_EVENT_ACTION_DOWN (x %f, y %f)", x,y);
  12. break;
  13. case AMOTION_EVENT_ACTION_MOVE:
  14. LOGI("android_main AMOTION_EVENT_ACTION_MOVE");
  15. break;
  16. case AMOTION_EVENT_ACTION_UP:
  17. LOGI("android_main AMOTION_EVENT_ACTION_UP");
  18. break;
  19. default:
  20. break;
  21. }
  22. }
  23. return 0;
  24. }
  25. void android_main(struct android_app* app)
  26. {
  27. app->onInputEvent = handleInputEvent;
  28. }

   本文主要介绍触摸事件是如何传递过来的,主要分为以下两个部分。

一、创建输入队列

    要收到输入事件,首先要创建输入队列,ViewRootImpl在处理setView请求时开始创建输入队列,代码如下。

  1. public final class ViewRootImpl implements ViewParent,
  2. View.AttachInfo.Callbacks, ThreadedRenderer.DrawCallbacks,
  3. AttachedSurfaceControl {
  4. public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView,
  5. int userId) {
  6. if (mInputQueueCallback != null) {
  7. mInputQueue = new InputQueue();
  8. mInputQueueCallback.onInputQueueCreated(mInputQueue);
  9. }
  10. }
  11. }
  12. public final class InputQueue {
  13. public InputQueue() {
  14. mPtr =
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/617506
推荐阅读
相关标签
  

闽ICP备14008679号