Android移动鼠标更新位置流程

 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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛文旺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值