android4.4之触摸点属性(down、move、up)

通常应用程序在处理触摸事件时一般会用到motionevent.getAction()来判断上报的触摸点是ACTION_DOWN、ACTION_MOVE或ACTION_UP,然后做出移动、缩放等处理逻辑。每一个触摸点属性是在哪里定义的呢?是驱动上报就标记了每个点的触摸属性吗?

直接给结论:对于触摸点的属性,在InputReader中的dispatchTouches()函数中定义,而不是驱动给的。

void TouchInputMapper::dispatchTouches(nsecs_t when, uint32_t policyFlags) {
    BitSet32 currentIdBits = mCurrentCookedPointerData.touchingIdBits;
    BitSet32 lastIdBits = mLastCookedPointerData.touchingIdBits;
    int32_t metaState = getContext()->getGlobalMetaState();
    int32_t buttonState = mCurrentButtonState;

    if (currentIdBits == lastIdBits) {
        if (!currentIdBits.isEmpty()) {
            // No pointer id changes so this is a move event.
            // The listener takes care of batching moves so we don't have to deal with that here.
            dispatchMotion(when, policyFlags, mSource,
                    AMOTION_EVENT_ACTION_MOVE, 0, metaState, buttonState,
                    AMOTION_EVENT_EDGE_FLAG_NONE,
                    mCurrentCookedPointerData.pointerProperties,
                    mCurrentCookedPointerData.pointerCoords,
                    mCurrentCookedPointerData.idToIndex,
                    currentIdBits, -1,
                    mOrientedXPrecision, mOrientedYPrecision, mDownTime);
        }
    } else {
        // There may be pointers going up and pointers going down and pointers moving
        // all at the same time.
        BitSet32 upIdBits(lastIdBits.value & ~currentIdBits.value);
        BitSet32 downIdBits(currentIdBits.value & ~lastIdBits.value);
        BitSet32 moveIdBits(lastIdBits.value & currentIdBits.value);
        BitSet32 dispatchedIdBits(lastIdBits.value);

        // Update last coordinates of pointers that have moved so that we observe the new
        // pointer positions at the same time as other pointers that have just gone up.
        bool moveNeeded = updateMovedPointers(
                mCurrentCookedPointerData.pointerProperties,
                mCurrentCookedPointerData.pointerCoords,
                mCurrentCookedPointerData.idToIndex,
                mLastCookedPointerData.pointerProperties,
                mLastCookedPointerData.pointerCoords,
                mLastCookedPointerData.idToIndex,
                moveIdBits);
        if (buttonState != mLastButtonState) {
            moveNeeded = true;
        }

        // Dispatch pointer up events.
        while (!upIdBits.isEmpty()) {
            uint32_t upId = upIdBits.clearFirstMarkedBit();

            dispatchMotion(when, policyFlags, mSource,
                    AMOTION_EVENT_ACTION_POINTER_UP, 0, metaState, buttonState, 0,
                    mLastCookedPointerData.pointerProperties,
                    mLastCookedPointerData.pointerCoords,
                    mLastCookedPointerData.idToIndex,
                    dispatchedIdBits, upId,
                    mOrientedXPrecision, mOrientedYPrecision, mDownTime);
            dispatchedIdBits.clearBit(upId);
        }

        // Dispatch move events if any of the remaining pointers moved from their old locations.
        // Although applications receive new locations as part of individual pointer up
        // events, they do not generally handle them except when presented in a move event.
        if (moveNeeded) {
            ALOG_ASSERT(moveIdBits.value == dispatchedIdBits.value);
            dispatchMotion(when, policyFlags, mSource,
                    AMOTION_EVENT_ACTION_MOVE, 0, metaState, buttonState, 0,
                    mCurrentCookedPointerData.pointerProperties,
                    mCurrentCookedPointerData.pointerCoords,
                    mCurrentCookedPointerData.idToIndex,
                    dispatchedIdBits, -1,
                    mOrientedXPrecision, mOrientedYPrecision, mDownTime);
        }

        // Dispatch pointer down events using the new pointer locations.
        while (!downIdBits.isEmpty()) {
            uint32_t downId = downIdBits.clearFirstMarkedBit();
            dispatchedIdBits.markBit(downId);

            if (dispatchedIdBits.count() == 1) {
                // First pointer is going down.  Set down time.
                mDownTime = when;
            }

            dispatchMotion(when, policyFlags, mSource,
                    AMOTION_EVENT_ACTION_POINTER_DOWN, 0, metaState, buttonState, 0,
                    mCurrentCookedPointerData.pointerProperties,
                    mCurrentCookedPointerData.pointerCoords,
                    mCurrentCookedPointerData.idToIndex,
                    dispatchedIdBits, downId,
                    mOrientedXPrecision, mOrientedYPrecision, mDownTime);
        }
    }
}

android4.4之触摸点属性(down、move、up),布布扣,bubuko.com

时间: 2024-12-19 04:27:24

android4.4之触摸点属性(down、move、up)的相关文章

JS—触摸事件、手势事件

JS-触摸事件.手势事件 dbclick触屏设备不支持双击事件.双击浏览器窗口,会放大画面.可以通过在head标签内加上这么一行: <meta name="viewport" content="width=device-width, minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"> 可以实现,我们编写的页面不会随着用的手势而放大缩小.关于meta标签,我还没有研究过,罪过啊. mouse在触屏上

触摸事件中touchstar、touchmove、touchend、touchcancel事件应用方法及实例

一. 分享到: 前面我们介绍过移动设备中一些设备事件,例如手机旋转90度.倾斜等设置放置姿态变化的四大事件orientationchange事件.MozOrientation事件.deviceorientation事件.devicemotion事件,接下由南昌网站建设公司百恒网络前端开发工程师向大介绍在移动端的触摸事件.       iOS版 Safari为了向开发人员传达一些特殊信息,新增了一些专有事件.因为 iOS设备既没有鼠标 也没有键盘,所以在为移动 Safari开发交互性网页时,常规的

cocos2dx触屏响应(单点触摸)CCTouchBegan,CCTouchMove,CCTouchEnd

今天白白跟大家分享一下cocos2dx单点触摸经验. cocos2dx触摸CCTouch类的单点触摸有四个函数CCTouchBegan,CCTouchMove,CCTouchEnd,CCTouchCancalled. 这些触摸的函数不一定每一个都要响应,可是CCTouchBegan是一定要有的,他的返回值是bool,其他函数返回值为void 以下我们看看怎样触摸: 首先我们新建一个项目Hello 1.在源文件Hello.h声明函数 void registerWithTouchDispatcher

HTML5触摸事件(touchstart、touchmove和touchend) (转)

HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主要是触摸事件:touchstart.touchmove和touchend. 一开始触摸事件touchstart.touchmove和touchend是iOS版Safari浏览器为了向开发人员传达一些信息新添加的事件.因为iOs设备既没有鼠标也没有键盘,所以在为移动Safari浏览器开发交互性网页的时

触屏设备触摸事件实验和记录

1. 事件概述 触屏设备的原始触摸事件有四个,[touchstart][touchmove][touchend][touchcancle],这里只讲前三个,因为最后一个是被动被打断时冒出的事件. 2. touchstart 用户把手指放到屏幕上的一刹那,触发的事件. 3. touchmove 用户用手指在屏幕上滑动,会持续触发这个事件. 4. touchend 用户的手指离开屏幕时触发的事件. 5. 属性概述 每一次触发事件,这个事件会 attach 一些 properties,就是附带一些额外

Android触摸事件(一)-TouchEventHelper

文件夹 文件夹 概述 关于更新 2016-08-31 2016-06-20 关于单点触摸事件singleTouch 单击的两种方式 关于双击事件 双击事件的检測逻辑 双击事件触发的时机 关于多点触摸事件multiTouch 两点触摸中的移动事件 两点触摸事件的触发过程 两点触摸的事件 实现 变量定义 触摸事件流程 自己定义事件计时方案 自己定义事件触发区域 触摸事件处理规则 关于回调的方法 触摸事件处理源代码 双击事件的优化处理 怎样检測当次触摸事件的单击事件 怎样检測触发双击事件 辅助补充逻辑

javaScript事件(九)事件类型之触摸与手势事件

一.触摸事件 touchstart:当手指触摸屏幕时触发:即使已经有一个手指放在了屏幕上也会触发. touchmove:当手指在屏幕上滑动时连续地触发.在这个世界发生期间,调用preventDefault()可以阻止滚动. touchend:当手指在屏幕上移开时触发. touchcancel:当系统停止跟踪触摸时触发.关于此事件的确切触发时间,文档中没有明确说明. 上面这几个事件都会冒泡,也都可以取消.虽然这些触摸事件没有在DOM规范中定义,但它们却是以兼容DOM的方式实现的.因此,每个触摸事件

H5实战与剖析之触摸事件(touchstart、touchmove和touchend)

HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主要是触摸事件:touchstart.touchmove和touchend. 一开始触摸事件touchstart.touchmove和touchend是iOs版Safari浏览器为了向开发人员传达一些信息新添加的事件.因为iOs设备既没有鼠标也没有键盘,所以在为移动Safari浏览器开发交互性网页的时

HTML5触摸事件演化tap事件

触摸事件是移动浏览器特有的HTML5事件,虽然click事件在pc和移动端更通用,但是在移动端会出现300ms延迟,较为影响用户体验,300ms延迟来自判断双击和长按,因为只有默认等待时间结束以确定没有后续动作发生时,才会触发click事件.所以触摸事件反应更快,体验更好. 触摸事件的类型: 为了区别触摸相关的状态改变,存在多种类型的触摸事件.可以通过检查触摸事件的 TouchEvent.type 属性来确定当前事件属于哪种类型. 注意: 在很多情况下,触摸事件和鼠标事件会同时被触发(目的是让没