NDK处理用户交互事件

在 android_main(struct android_app* state)函数里面设置输入事件处理函数:


state->onInputEvent = &handleInput; //设置输入事件的处理函数,如触摸响应






static int32_t handleInput(struct android_app* app, AInputEvent* event)
{
//获取消息的类型,消息有两种类型,一种是Motion类型一种是key类型。


int32_t lEventType = AInputEvent_getType(event);
switch(lEventType)
{
case AINPUT_EVENT_TYPE_MOTION:
//motion类型的消息的来源有两种,所以要获取消息的来源
switch(AInputEvent_getSource(event))
{
case AINPUT_SOURCE_TOUCHSCREEN:
//消息来源于触摸屏
break;
case AINPUT_SOURCE_TRACKBALL:
//消息来源于trackball
break;
}
break;
case AINPUT_EVENT_TYPE_KEY:
//消息来源于物理键盘或虚拟键盘,这个处理是一样的
break;
}


//知道来源与那里的时候,在判断具体是什么消息
int32_t id = AMotionEvent_getAction(event);
switch(id)
{
//触摸移动消息
case AMOTION_EVENT_ACTION_MOVE:
pNode->yaw(Ogre::Radian(Ogre::Degree(10.0f)));
break;
//触摸按下消息
case AMOTION_EVENT_ACTION_DOWN:
pNode->yaw(Ogre::Radian(Ogre::Degree(10.0f)));
break;
触摸弹起消息
case AMOTION_EVENT_ACTION_UP:
pNode->yaw(Ogre::Radian(Ogre::Degree(10.0f)));
break;
}
}


还有一些函数是获取坐标点的, 是绝对坐标:AMotionEvent_getX(),以屏幕左上角为原点。

AMotionEvent_getXOffset(event),返回0.0


AMotionEvent_getXPrecision(event)返回1.0


   下面这两个函数用于多点触摸
AMotionEvent_getPointerCount(const AInputEvent* motion_event);但是测试发现按下两个手指也返回1,不知道是不是硬件问题


AMotionEvent_getPointerId(const AInputEvent* motion_event, size_t pointer_index);不知道怎么用




AMotionEvent_getRawX(event,0); //这个返回的是相对于屏幕左上角的坐标,
AMotionEvent_getX(event,0); //和AMotionEvent_getRawX返回值一样
//这两个函数,如果第二个参数改成1之后,返回值总是为0.0
//说明这个pointer_index还是有用的。


终于弄明白这个point_index是什么意思了,这个值表示第几个手指,哈哈。


但是这个AMotionEvent_getPointerCount无论按下几个手指为什么老是返回1呢?


AMotionEvent_getOrientation(event,0); //总是返回0.0,按下两个手指有时有值。




输入设备有哪些:1 物理键盘,2 D-PAD,3 Trackball


输入类型:









enum {
    /**
     * Command from main thread: the AInputQueue has changed.  Upon processing
     * this command, android_app->inputQueue will be updated to the new queue
     * (or NULL).
     */
    APP_CMD_INPUT_CHANGED,
    /**
     * Command from main thread: a new ANativeWindow is ready for use.  Upon
     * receiving this command, android_app->window will contain the new window
     * surface.
     */
    APP_CMD_INIT_WINDOW,
    /**
     * Command from main thread: the existing ANativeWindow needs to be
     * terminated.  Upon receiving this command, android_app->window still
     * contains the existing window; after calling android_app_exec_cmd
     * it will be set to NULL.
     */
    APP_CMD_TERM_WINDOW,
    /**
     * Command from main thread: the current ANativeWindow has been resized.
     * Please redraw with its new size.
     */
    APP_CMD_WINDOW_RESIZED,
    /**
     * Command from main thread: the system needs that the current ANativeWindow
     * be redrawn.  You should redraw the window before handing this to
     * android_app_exec_cmd() in order to avoid transient drawing glitches.
     */
    APP_CMD_WINDOW_REDRAW_NEEDED,
    /**
     * Command from main thread: the content area of the window has changed,
     * such as from the soft input window being shown or hidden.  You can
     * find the new content rect in android_app::contentRect.
     */
    APP_CMD_CONTENT_RECT_CHANGED,
   /**
     * Command from main thread: the app's activity window has gained
     * input focus.
     */
    APP_CMD_GAINED_FOCUS,
    /**
     * Command from main thread: the app's activity window has lost
     * input focus.
     */
    APP_CMD_LOST_FOCUS,
    /**
     * Command from main thread: the current device configuration has changed.
     */
    APP_CMD_CONFIG_CHANGED,
    /**
     * Command from main thread: the system is running low on memory.
     * Try to reduce your memory use.
     */
    APP_CMD_LOW_MEMORY,
    /**
     * Command from main thread: the app's activity has been started.
     */
    APP_CMD_START,
    /**
     * Command from main thread: the app's activity has been resumed.
     */
    APP_CMD_RESUME,
    /**
     * Command from main thread: the app should generate a new saved state
     * for itself, to restore from later if needed.  If you have saved state,
     * allocate it with malloc and place it in android_app.savedState with
     * the size in android_app.savedStateSize.  The will be freed for you
     * later.
     */
    APP_CMD_SAVE_STATE,
    /**
    * Command from main thread: the app's activity has been paused.
     */
    APP_CMD_PAUSE,
    /**
     * Command from main thread: the app's activity has been stopped.
     */
    APP_CMD_STOP,
    /**
     * Command from main thread: the app's activity is being destroyed,
     * and waiting for the app thread to clean up and exit before proceeding.
     */
    APP_CMD_DESTROY,
};
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值