IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> IMS:MotionEvent 坐标点(上) -> 正文阅读

[移动开发]IMS:MotionEvent 坐标点(上)

IMS:MotionEvent 坐标点(上)

android12-security-release
主要查看获取hal底层原始坐标,并通过InputChannel发送流程,其中只关注坐标点


Android屏幕x、y轴

屏幕的左上角作为坐标原点,X轴向右为正,Y轴向下为正。
在这里插入图片描述

开发者选项中指针位置、ViewRootImpl坐标

打开IMS:开发者选项中指针位置开关,比较直观查看:
在这里插入图片描述
在这里插入图片描述
X:640.9 Y:1250.9这个就是坐标点(640.9,1250.9),这里(ps.mCoords.x,ps.mCoords.y)通过PointerEventDispatcher/InputChannel传递上来的MotionEvent
在这里插入图片描述
ViewRootImpl是通过WindowInputEventReceiver\InputChannel传递上来的MotionEvent,实质都是InputEventReceiver\InputChannel
在这里插入图片描述

InputEventReceiver传递MotionEvent

IMS:InputChannel通过socket发送Input给App
在这里插入图片描述
frameworks/base/core/java/android/view/InputEventReceiver.java
在这里插入图片描述
frameworks/base/core/jni/android_view_InputEventReceiver.cpp
在这里插入图片描述

绕不开的JNI

frameworks/base/core/java/android/view/MotionEvent.java
frameworks/base/core/jni/android_view_MotionEvent.cpp
frameworks/native/include/input/Input.h
对象PointerCoords中:
在这里插入图片描述

InputDispatcher分发时坐标点

IMS:InputDispatcher线程分发事件
frameworks/native/libs/input/InputTransport.cpp
frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp
在这里插入图片描述 在这里插入图片描述
(motionEntry.xCursorPosition,motionEntry.yCursorPosition)
InputDispatcher.cpp中对象传递:(建议倒着查看流程

mInboundQueue.push_back(std::move(newEntry));【enqueueInboundEventLocked(std::move(newEntry));】
mPendingEvent = mInboundQueue.front();
std::shared_ptr<MotionEntry> motionEntry = std::static_pointer_cast<MotionEntry>(mPendingEvent);
connection->outboundQueue.push_back(dispatchEntry.release());【enqueueDispatchEntryLocked(…)】
DispatchEntry* dispatchEntry = connection->outboundQueue.front();
EventEntry& eventEntry = *(dispatchEntry->eventEntry);
MotionEntry& motionEntry = static_cast<const MotionEntry&>(eventEntry);

InputReader获取处理MotionEvent

IMS:InputReader线程获取输入事件

frameworks/native/services/inputflinger/InputListener.cpp
frameworks/native/services/inputflinger/reader/InputReader.cpp
frameworks/native/services/inputflinger/reader/InputDevice.cpp
size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);
processEventsLocked(mEventBuffer, count);
processEventsForDeviceLocked(deviceId, rawEvent, batchSize);
device->process(rawEvents, count);
mapper.process(rawEvent);

// --- NotifyMotionArgs ---

NotifyMotionArgs::NotifyMotionArgs(
        int32_t id, nsecs_t eventTime, nsecs_t readTime, int32_t deviceId, uint32_t source,
        int32_t displayId, uint32_t policyFlags, int32_t action, int32_t actionButton,
        int32_t flags, int32_t metaState, int32_t buttonState, MotionClassification classification,
        int32_t edgeFlags, uint32_t pointerCount, const PointerProperties* pointerProperties,
        const PointerCoords* pointerCoords, float xPrecision, float yPrecision,
        float xCursorPosition, float yCursorPosition, nsecs_t downTime,
        const std::vector<TouchVideoFrame>& videoFrames)
      : NotifyArgs(id, eventTime),
        deviceId(deviceId),
        source(source),
        displayId(displayId),
        policyFlags(policyFlags),
        action(action),
        actionButton(actionButton),
        flags(flags),
        metaState(metaState),
        buttonState(buttonState),
        classification(classification),
        edgeFlags(edgeFlags),
        pointerCount(pointerCount),
        xPrecision(xPrecision),
        yPrecision(yPrecision),
        xCursorPosition(xCursorPosition),
        yCursorPosition(yCursorPosition),
        downTime(downTime),
        readTime(readTime),
        videoFrames(videoFrames) {
    for (uint32_t i = 0; i < pointerCount; i++) {
        this->pointerProperties[i].copyFrom(pointerProperties[i]);
        this->pointerCoords[i].copyFrom(pointerCoords[i]);
    }
}
//... ...
void NotifyMotionArgs::notify(const sp<InputListenerInterface>& listener) const {
    listener->notifyMotion(this);
}

SingleTouchInputMapper\MultiTouchInputMapper处理

  1. EventHub连接硬件设备\外部设备时,匹配添加相应InputMapper
    在这里插入图片描述
  2. ......TouchInputMapper::process处理–processRawTouchescookAndDispatchdispatch...dispatchMotion
    在这里插入图片描述
  3. NotifyMotionArgs 初始化参数xPrecision, yPrecisionmOrientedXPrecision, mOrientedYPrecision
void TouchInputMapper::dispatchMotion(nsecs_t when, nsecs_t readTime, uint32_t policyFlags,
                                      uint32_t source, int32_t action, int32_t actionButton,
                                      int32_t flags, int32_t metaState, int32_t buttonState,
                                      int32_t edgeFlags, const PointerProperties* properties,
                                      const PointerCoords* coords, const uint32_t* idToIndex,
                                      BitSet32 idBits, int32_t changedId, float xPrecision,
                                      float yPrecision, nsecs_t downTime) {
    // ... ...
    NotifyMotionArgs args(getContext()->getNextId(), when, readTime, deviceId, source, displayId,
                          policyFlags, action, actionButton, flags, metaState, buttonState,
                          MotionClassification::NONE, edgeFlags, pointerCount, pointerProperties,
                          pointerCoords, xPrecision, yPrecision, xCursorPosition, yCursorPosition,
                          downTime, std::move(frames));
    getListener()->notifyMotion(&args);
}

在这里插入图片描述

  1. RawPointerAxes
    在这里插入图片描述

EventHub获取屏幕硬件上报

IMS:EventHub设备底层上报Input事件对象处理

在这里插入图片描述在这里插入图片描述在这里插入图片描述

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:52:02  更:2022-04-26 11:54:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 23:28:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码