画鼠标和触摸屏光标流程

来源:互联网 发布:阿里云香港服务器延迟 编辑:程序博客网 时间:2024/05/21 09:11

1. 画鼠标光标流程

    设置新的Mouse Cursor位置与画Mouse Cursor是异步的。

InputReader::loopOnce->InputReader::processEventsLocked->InputReader::processEventsForDeviceLocked->InputDevice::process(numMappers=1)->InputMapper::process(CursorInputMapper::process)->CursorInputMapper::sync->PointerController::move (偏移量)->  PointerController::setPositionLocked(绝对值)    PointerController::updatePointerLocked       *SpriteController::openTransaction()       *SpriteController::SpriteImpl::setLayer(int32_t layer)       *SpriteController::SpriteImpl::setPosition(float x, float y) (绝对值,画光标的屏幕坐标)          SpriteController::SpriteImpl::invalidateLocked->(如果位置有变,则调用此函数)            SpriteController::invalidateSpriteLocked                     *SpriteController::SpriteImpl::setAlpha(float alpha)       *SpriteController::SpriteImpl::setVisible(bool visible)       *SpriteController::SpriteImpl::setIcon(const SpriteIcon& icon)         *SpriteController::closeTransaction()(发送MSG_UPDATE_SPRITES消息给SpriteController)画光标:SpriteController::handleMessage(const Message& message)->   SpriteController::doUpdateSprites()(真正负责画光标) 


1.1 Log信息(移动鼠标)

D/InputReader(  369): InputReader::loopOnce call InputReader::processEventsLockedD/InputReader(  369): InputReader::processEventsLocked call InputReader::processEventsForDeviceLockedD/InputReader(  369): InputReader::processEventsForDeviceLocked call InputDevice::processD/InputReader(  369): InputDevice::process call InputMapper::process, numMappers=1D/InputReader(  369): CursorInputMapper::process call CursorInputMapper->syncD/InputReader(  370): CursorInputMapper::sync call mPointerController->moveD/PointerController(  370): Move pointer by deltaX=-2.000, deltaY=0.000D/PointerController(  370): PointerController::updatePointerLocked start...D/Sprites (  370): openTransactionD/Sprites (  370): setLayer,layer=0D/Sprites (  370): setPosition,x=1050.746338,y=534.966919D/Sprites (  370): invalidateLockedD/Sprites (  370): invalidateSpriteLockedD/Sprites (  370): setAlpha,alpha=1.000000D/Sprites (  370): setVisible,old=1,visible=1D/Sprites (  370): closeTransactionD/Sprites (  370): closeTransaction, send MSG_UPDATE_SPRITESD/PointerController(  370): :PointerController::updatePointerLocked end...D/PointerController(  370): PointerController::updatePointerLocked start...D/Sprites (  370): openTransactionD/Sprites (  370): setLayer,layer=0D/Sprites (  370): setPosition,x=1050.746338,y=534.966919D/Sprites (  370): setAlpha,alpha=1.000000D/Sprites (  370): setVisible,old=1,visible=1D/Sprites (  370): closeTransactionD/PointerController(  370): PointerController::updatePointerLocked end...D/PointerController(  370): getPosition x=1050.746, y=534.967D/Sprites (  370): handleMessageD/Sprites (  370): doUpdateSprites

2. 画触摸屏光标流程

InputReader::loopOnce->InputReader::processEventsLocked->InputReader::processEventsForDeviceLocked->InputDevice::process(numMappers=1)->InputMapper::process(SingleTouchInputMapper::process->TouchInputMapper::process)->TouchInputMapper::sync->SingleTouchInputMapper::syncTouch(获取touch数据)->TouchInputMapper::dispatchPointerUsage->TouchInputMapper::dispatchPointerStylus->PointerController::setPosition->  PointerController::setPositionLocked(绝对值)    PointerController::updatePointerLocked       *SpriteController::openTransaction()       *SpriteController::SpriteImpl::setLayer(int32_t layer)       *SpriteController::SpriteImpl::setPosition(float x, float y) (绝对值,画光标的屏幕坐标)          SpriteController::SpriteImpl::invalidateLocked->(如果位置有变,则调用此函数)            SpriteController::invalidateSpriteLocked                     *SpriteController::SpriteImpl::setAlpha(float alpha)       *SpriteController::SpriteImpl::setVisible(bool visible)       *SpriteController::SpriteImpl::setIcon(const SpriteIcon& icon)         *SpriteController::closeTransaction()(发送MSG_UPDATE_SPRITES消息给SpriteController)画光标:SpriteController::handleMessage(const Message& message)->   SpriteController::doUpdateSprites()(真正负责画光标) 



2.1 产生Touch Move和Touch Button的实例代码

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include <android/log.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/stat.h>#include "uinput.h"#define LOG_TAG "TOUCH_TEST"#define ALOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, fmt, ##args)#define ALOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, fmt, ##args)#define ALOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, fmt, ##args)#define BUTTON_DOWN 1#define BUTTON_UP   0/* global variable */static int uinput_fd = -1; struct uinput_user_dev uinput; // uInput device structure /* Setup the uinput device */ int setup_uinput_device() {    //int i=0;    int ret;      // Open the input device    uinput_fd = open("/dev/uinput", O_WRONLY | O_NDELAY);    if (uinput_fd < 0){       ALOGE("Unable to open /dev/uinput/n");       return -1;    }       memset(&uinput,0,sizeof(uinput)); // Intialize the uInput device to NULL    strncpy(uinput.name, "vtouch", UINPUT_MAX_NAME_SIZE);    uinput.id.version = 4;    uinput.id.bustype = BUS_USB;    uinput.absmin[ABS_X] = 0;   uinput.absmax[ABS_X] = 1280;    uinput.absmin[ABS_Y] = 0;   uinput.absmax[ABS_Y] = 720;       // Setup the uinput device    ret = ioctl(uinput_fd, UI_SET_EVBIT, EV_ABS);    if(ret){      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   ret = ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY);    if(ret){      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   ret = ioctl(uinput_fd, UI_SET_ABSBIT, ABS_X);   if(ret){      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }      ret = ioctl(uinput_fd, UI_SET_ABSBIT, ABS_Y);   if(ret){      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   ret = ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOUCH);   if(ret){      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   ret = ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOOL_MOUSE);   if(ret){      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   ret = ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOOL_PEN);   if(ret){      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   ret = ioctl(uinput_fd, UI_SET_KEYBIT, KEY_BACK);   if(ret){      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   /*        ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY);      ioctl(uinput_fd, UI_SET_EVBIT, EV_REL);           ioctl(uinput_fd, UI_SET_RELBIT, REL_X);      ioctl(uinput_fd, UI_SET_RELBIT, REL_Y);         for (i=0; i < 256; i++) {         ioctl(uinput_fd, UI_SET_KEYBIT, i);      }           ioctl(uinput_fd, UI_SET_KEYBIT, BTN_MOUSE);      ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOUCH);      ioctl(uinput_fd, UI_SET_KEYBIT, BTN_MOUSE);      ioctl(uinput_fd, UI_SET_KEYBIT, BTN_LEFT);      ioctl(uinput_fd, UI_SET_KEYBIT, BTN_MIDDLE);      ioctl(uinput_fd, UI_SET_KEYBIT, BTN_RIGHT);      ioctl(uinput_fd, UI_SET_KEYBIT, BTN_FORWARD);      ioctl(uinput_fd, UI_SET_KEYBIT, BTN_BACK);      */        // Create input device into input sub-system    if(write(uinput_fd, &uinput, sizeof(uinput))== -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }         if(ioctl(uinput_fd, UI_DEV_CREATE))    {       ALOGE("Unable to create UINPUT device.");       return -1;    }       return 0; } /* Destroy the uinput device */ int destroy_uinput_device() {   // Destroy the uinput device   ioctl(uinput_fd, UI_DEV_DESTROY);       // Close the uinput device    close(uinput_fd);}int write_touch_move(int x, int y) {    struct input_event event;    int ret;      // Move pointer to (0,0) location    memset(&event, 0, sizeof(event));    gettimeofday(&event.time, NULL);    event.type = EV_ABS;   event.code = ABS_X;   event.value = x;   ret = write(uinput_fd,&event,sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }         event.type = EV_ABS;   event.code = ABS_Y;   event.value = y;   ret = write(uinput_fd,&event,sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   event.type = EV_KEY;   event.code = BTN_TOOL_PEN;    event.value = 1;   ret = write(uinput_fd,&event,sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }      event.type = EV_SYN;    event.code = SYN_REPORT;    event.value = 0;    ret = write(uinput_fd, &event, sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   return 0;} int write_touch_hide(void) {    struct input_event event;    int ret;      // Move pointer to (0,0) location    memset(&event, 0, sizeof(event));    gettimeofday(&event.time, NULL);    event.type = EV_ABS;   event.code = ABS_X;   event.value = 0;   ret = write(uinput_fd,&event,sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }         event.type = EV_ABS;   event.code = ABS_Y;   event.value = 0;   ret = write(uinput_fd,&event,sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   event.type = EV_KEY;   event.code = BTN_TOOL_PEN;    event.value = 0;   ret = write(uinput_fd,&event,sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }      event.type = EV_SYN;    event.code = SYN_REPORT;    event.value = 0;    ret = write(uinput_fd, &event, sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   return 0;}int write_key(int key, int down) {    struct input_event event;    int ret;      // Move pointer to (0,0) location    memset(&event, 0, sizeof(event));    gettimeofday(&event.time, NULL);    event.type = EV_KEY;   event.code = key;    event.value = down;   ret = write(uinput_fd,&event,sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }      event.type = EV_SYN;    event.code = SYN_REPORT;    event.value = 0;    ret = write(uinput_fd, &event, sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   return 0;}int write_touch_button(int x, int y, int down)  {    struct input_event event;    int ret;      // Move pointer to (0,0) location    memset(&event, 0, sizeof(event));    gettimeofday(&event.time, NULL);    event.type = EV_ABS;   event.code = ABS_X;   event.value = x;   ret = write(uinput_fd,&event,sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }         event.type = EV_ABS;   event.code = ABS_Y;   event.value = y;   ret = write(uinput_fd,&event,sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }      event.type = EV_KEY;   event.code = BTN_TOUCH;    event.value = down;   ret = write(uinput_fd,&event,sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   event.type = EV_SYN;    event.code = SYN_REPORT;    event.value = 0;    ret = write(uinput_fd, &event, sizeof(event));   if(ret == -1){      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);      return -1;      }   return 0;}#define DIS_PIXEL 1#define DUR_TIME  5int main(int argc, char** argv) {   int i;   // Initialize uinput device   if(setup_uinput_device()){      ALOGE("setup uinput device fail");      return -1;      }   // Send gsensor event   int write_count=0;   int count =0;   int x=0,y=0;   count = 0;   while(1){  // for touch screen           x = 10;        y = 10;                while(x <1270){            write_touch_move(x,y);            x+=DIS_PIXEL;            usleep(DUR_TIME*1000);        }                y+=DIS_PIXEL;        while(y < 710){            write_touch_move(x,y);            y+=DIS_PIXEL;            usleep(DUR_TIME*1000);                    }        x -=DIS_PIXEL;        while(x > 10){            write_touch_move(x,y);            x-=DIS_PIXEL;            usleep(DUR_TIME*1000);                    }                /*        y -=DIS_PIXEL;        while(y > 10){            write_touch_move(x,y);            y-=DIS_PIXEL;            usleep(DUR_TIME*1000);                    }         */                write_touch_hide();        sleep(5);                /*        count++;        if(count>5){            while(1){                sleep(60);            }                        }        */   }      // Destroy uinput device    destroy_uinput_device();   return 0;}



2.2 log信息

D/InputReader(  356): SingleTouchInputMapper::processD/InputReader(  356): type=3,code=0,value=500D/InputReader(  356): SingleTouchInputMapper::processD/InputReader(  356): type=3,code=1,value=500D/InputReader(  356): SingleTouchInputMapper::processD/InputReader(  356): type=0,code=0,value=0D/InputReader(  356): call sync...D/InputReader(  356): sync mDeviceMode=3D/InputReader(  356): SingleTouchInputMapper::syncTouch, isToolActive=1D/InputReader(  356): syncTouch: pointerCount 1 -> 1, touching ids 0x00000000 -> 0x00000000, hovering ids 0x80000000 -> 0x80000000D/InputReader(  356): sync Line:4107D/InputReader(  356): sync Line:4110D/InputReader(  356): sync Line:4127D/InputReader(  356): sync Line:4139,pointerUsage=2D/InputReader(  356): sync Line:4150,pointerUsage=2D/InputReader(  356): dispatchPointerUsage mPointerUsage=2D/Sprites (  356):  setPosition,x=499.609680,y=499.306519D/Sprites (  356):  setPosition,x=499.609680,y=499.306519D/Sprites (  356):  setPosition:x=499.609680,y=499.306519D/Sprites (  356):  setPosition:hotx=6.000000,hoty=6.000000D/InputReader(  356): SingleTouchInputMapper::processD/InputReader(  356): type=3,code=0,value=600D/InputReader(  356): SingleTouchInputMapper::processD/InputReader(  356): type=3,code=1,value=600D/InputReader(  356): SingleTouchInputMapper::processD/InputReader(  356): type=0,code=0,value=0D/InputReader(  356): call sync...D/InputReader(  356): sync mDeviceMode=3D/InputReader(  356): SingleTouchInputMapper::syncTouch, isToolActive=1D/InputReader(  356): syncTouch: pointerCount 1 -> 1, touching ids 0x00000000 -> 0x00000000, hovering ids 0x80000000 -> 0x80000000D/InputReader(  356): sync Line:4107D/InputReader(  356): sync Line:4110D/InputReader(  356): sync Line:4127D/InputReader(  356): sync Line:4139,pointerUsage=2D/InputReader(  356): sync Line:4150,pointerUsage=2D/InputReader(  356): dispatchPointerUsage mPointerUsage=2D/Sprites (  356):  setPosition,x=599.531616,y=599.167847D/Sprites (  356):  setPosition,x=599.531616,y=599.167847D/Sprites (  356):  setPosition:x=599.531616,y=599.167847D/Sprites (  356):  setPosition:hotx=6.000000,hoty=6.000000




原创粉丝点击