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

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

码农世界 2024-05-27 前端 73 次浏览 0个评论

 在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 = 

转载请注明来自码农世界,本文标题:《Android NDK系列(三)输入事件分发到Native层的流程》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,73人围观)参与讨论

还没有评论,来说两句吧...

Top