Android移动鼠标更新位置流程
//移动鼠标
@frameworks/native/services/inputflinger/reader/mapper/CursorInputMapper.cpp
CursorInputMapper::sync
@frameworks/base/libs/input/PointerController.cpp
mPointerController->move(dx, dy);
@frameworks/base/libs/input/MouseCursorController.cpp
CursorController.move(deltaX, deltaY);
setPositionLocked(mLocked.pointerX + deltaX, mLocked.pointerY + deltaY); //mLocked.pointerX是当前点的绝对坐标, deltaX=-13.000000, deltaY=0.000000 mLocked.pointerX=1919.500000 mLocked.pointerY=539.500000
updatePointerLocked(); //setPositionLocked, x=1906.500000, y=539.500000
@frameworks/base/libs/input/SpriteController.cpp
mLocked.pointerSprite->setPosition(mLocked.pointerX, mLocked.pointerY);
invalidateLocked(DIRTY_POSITION);
if (!wasDirty) { mController->invalidateSpriteLocked(this); }
mLocked.invalidatedSprites.push(sprite); //放入invalidatedSprites
SpriteController::handleMessage
case MSG_UPDATE_SPRITES: doUpdateSprites
Vector<SpriteUpdate> updates;
numSprites = mLocked.invalidatedSprites.size();
for (size_t i = 0; i < numSprites; i++) {
const sp<SpriteImpl>& sprite = mLocked.invalidatedSprites.itemAt(i); 取出invalidatedSprites
updates.push(SpriteUpdate(sprite, sprite->getStateLocked()));
SurfaceComposerClient::Transaction t;
for (size_t i = 0; i < numSprites; i++) {
SpriteUpdate& update = updates.editItemAt(i);
if (update.state.surfaceControl == NULL && update.state.wantSurfaceVisible()) {
update.state.surfaceControl = obtainSurface(update.state.surfaceWidth, update.state.surfaceHeight); //创建Surface
sp<SurfaceControl> surfaceControl = mSurfaceComposerClient->createSurface(String8("Sprite"), width, height, PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eHidden | ISurfaceComposerClient::eCursorWindow);
update.surfaceChanged = surfaceChanged = true;
if (update.surfaceChanged || update.state.dirty & DIRTY_DISPLAY_ID) //创建Surface时设置update.surfaceChanged成true,更新Layer的displayId,这里决定了2D鼠标在哪个显示屏上显示
t.setLayerStack(update.state.surfaceControl, update.state.displayId);
if (wantSurfaceVisibleAndDrawn && (becomingVisible || (update.state.dirty & (DIRTY_POSITION | DIRTY_HOTSPOT)))) {
//设置显示位置, update.state.positionX=1906.500000,update.state.positionY=539.500000, update.state.icon.hotSpotX=10.000000 update.state.icon.hotSpotY=10.000000
t.setPosition(update.state.surfaceControl, update.state.positionX - update.state.icon.hotSpotX, update.state.positionY - update.state.icon.hotSpotY);
mLocked.pointerSprite->setDisplayId(mLocked.viewport.displayId);
if (mLocked.state.displayId != displayId) { mLocked.state.displayId = displayId; invalidateLocked(DIRTY_DISPLAY_ID); } //不相等则更新displayId,设置成viewport.displayId