当前位置: 代码迷 >> Android >> android4.4之抚摸点属性(down、move、up)
  详细解决方案

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

热度:273   发布时间:2016-04-28 04:44:44.0
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);        }    }}

  相关解决方案