Inputreader surface设置

1. Inputreader 初始化获取device信息和发送data

InputReader.cpp
void InputReader::loopOnce() {
	processEventsLocked
	getInputDevicesLocked

void InputReader::processEventsLocked(const RawEvent* rawEvents, size_t count) {
    for (const RawEvent* rawEvent = rawEvents; count;) {
        int32_t type = rawEvent->type;
        size_t batchSize = 1;
        if (type < EventHubInterface::FIRST_SYNTHETIC_EVENT) {
            int32_t deviceId = rawEvent->deviceId;
            while (batchSize < count) {
                if (rawEvent[batchSize].type >= EventHubInterface::FIRST_SYNTHETIC_EVENT ||
                    rawEvent[batchSize].deviceId != deviceId) {
                    break;
                }
                batchSize += 1;
            }
#if DEBUG_RAW_EVENTS
            ALOGD("BatchSize: %zu Count: %zu", batchSize, count);
#endif
            processEventsForDeviceLocked(deviceId, rawEvent, batchSize);
        } else {
            switch (rawEvent->type) {
                case EventHubInterface::DEVICE_ADDED:
                    addDeviceLocked(rawEvent->when, rawEvent->deviceId);//回调framework中的InputManage中的deviceadd
					
					//addDeviceLocked
						createDeviceLocked 	       
							device->addEventHubDevice(eventHubId)
								mDevices.emplace(eventHubId, device);//添加到列表中
						configure( 初始化数据
                    break;
                case EventHubInterface::DEVICE_REMOVED:
                    removeDeviceLocked(rawEvent->when, rawEvent->deviceId);
                    break;
                case EventHubInterface::FINISHED_DEVICE_SCAN:
                    handleConfigurationChangedLocked(rawEvent->when);
                    break;
                default:
                    ALOG_ASSERT(false); // can't happen
                    break;
            }
        }
        count -= batchSize;
        rawEvent += batchSize;
    }
}

	getInputDevicesLocked
		InputDevice.cpp 
			InputDevice::getDeviceInfo(
				Map.cpp
					populateDeviceInfo
根据类型进行device change 和发送Event数据
void InputReader::processEventsLocked(const RawEvent* rawEvents, size_t count) {
    for (const RawEvent* rawEvent = rawEvents; count;) {
        int32_t type = rawEvent->type;
        size_t batchSize = 1;
        if (type < EventHubInterface::FIRST_SYNTHETIC_EVENT) {
            int32_t deviceId = rawEvent->deviceId;
            while (batchSize < count) {
                if (rawEvent[batchSize].type >= EventHubInterface::FIRST_SYNTHETIC_EVENT ||
                    rawEvent[batchSize].deviceId != deviceId) {
                    break;
                }
                batchSize += 1;
            }
#if DEBUG_RAW_EVENTS
            ALOGD("BatchSize: %zu Count: %zu", batchSize, count);
#endif
            processEventsForDeviceLocked(deviceId, rawEvent, batchSize);
        } else {
            switch (rawEvent->type) {
                case EventHubInterface::DEVICE_ADDED:
                    addDeviceLocked(rawEvent->when, rawEvent->deviceId);//回调framework中的InputManage中的deviceadd
					
					//addDeviceLocked
						createDeviceLocked 	       
							device->addEventHubDevice(eventHubId)
								mDevices.emplace(eventHubId, device);//添加到列表中
						configure( 初始化数据//
                    break;
                case EventHubInterface::DEVICE_REMOVED:
                    removeDeviceLocked(rawEvent->when, rawEvent->deviceId);
                    break;
                case EventHubInterface::FINISHED_DEVICE_SCAN:
                    handleConfigurationChangedLocked(rawEvent->when);
                    break;
                default:
                    ALOG_ASSERT(false); // can't happen
                    break;
            }
        }
        count -= batchSize;
        rawEvent += batchSize;
    }
}
以touch为例进行
InputReader
processEventsForDeviceLocked
	TouchInputMapper	
		process
			sync
				syncTouch //获取data数据
				processRawTouches(	
					//根据size调用
					 cookAndDispatch(//主要任务是分配类型 发送不同的event
                        consumeRawTouches 判断标志 边缘距离
						cookPointerData(
							rotateAndScale 设置data转化为当前适配的坐标
						根据devicemode call diff method
						dispatchPointerUsage(pointer属性)
							dispatchPointerGestures 触摸板
							dispatchPointerStylus 笔
							dispatchPointerMouse 鼠标
						 else 
						 derict属性

2.配置surface

TouchInputMapper.cpp

//根据kernel进行属性设置。 也可以在cl配置
void TouchInputMapper::configureParameters() {
    // Use the pointer presentation mode for devices that do not support distinct
    // multitouch.  The spot-based presentation relies on being able to accurately
    // locate two or more fingers on the touch pad.
    mParameters.gestureMode = getDeviceContext().hasInputProperty(INPUT_PROP_SEMI_MT)
            ? Parameters::GESTURE_MODE_SINGLE_TOUCH
            : Parameters::GESTURE_MODE_MULTI_TOUCH;

    String8 gestureModeString;
    if (getDeviceContext().getConfiguration().tryGetProperty(String8("touch.gestureMode"),
                                                             gestureModeString)) {
        if (gestureModeString == "single-touch") {
            mParameters.gestureMode = Parameters::GESTURE_MODE_SINGLE_TOUCH;
        } else if (gestureModeString == "multi-touch") {
            mParameters.gestureMode = Parameters::GESTURE_MODE_MULTI_TOUCH;
        } else if (gestureModeString != "default") {
            ALOGW("Invalid value for touch.gestureMode: '%s'", gestureModeString.string());
        }
    }

    // keynel属性
    if (getDeviceContext().hasInputProperty(INPUT_PROP_DIRECT)) {
        // The device is a touch screen.
        mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_SCREEN;
    } else if (getDeviceContext().hasInputProperty(INPUT_PROP_POINTER)) {
        // The device is a pointing device like a track pad.
        mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
    } else if (getDeviceContext().hasRelativeAxis(REL_X) ||
               getDeviceContext().hasRelativeAxis(REL_Y)) {
        // The device is a cursor device with a touch pad attached.
        // By default don't use the touch pad to move the pointer.
        mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_PAD;
    } else {
        // The device is a touch pad of unknown purpose.
        mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
    }

    mParameters.hasButtonUnderPad = getDeviceContext().hasInputProperty(INPUT_PROP_BUTTONPAD);
    // 可以在idc进行配置/system/usr/idc
    String8 deviceTypeString;
    if (getDeviceContext().getConfiguration().tryGetProperty(String8("touch.deviceType"),
                                                             deviceTypeString)) {
        if (deviceTypeString == "touchScreen") {
            mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_SCREEN;
        } else if (deviceTypeString == "touchPad") {
            mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_PAD;
        } else if (deviceTypeString == "touchNavigation") {
            mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_NAVIGATION;
        } else if (deviceTypeString == "pointer") {
            mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
        } else if (deviceTypeString != "default") {
            ALOGW("Invalid value for touch.deviceType: '%s'", deviceTypeString.string());
        }
    }

    mParameters.orientationAware = mParameters.deviceType == Parameters::DEVICE_TYPE_TOUCH_SCREEN;
    getDeviceContext().getConfiguration().tryGetProperty(String8("touch.orientationAware"),
                                                         mParameters.orientationAware);

    mParameters.hasAssociatedDisplay = false;
    mParameters.associatedDisplayIsExternal = false;
    if (mParameters.orientationAware ||
        mParameters.deviceType == Parameters::DEVICE_TYPE_TOUCH_SCREEN ||
        mParameters.deviceType == Parameters::DEVICE_TYPE_POINTER) {
        mParameters.hasAssociatedDisplay = true;
        if (mParameters.deviceType == Parameters::DEVICE_TYPE_TOUCH_SCREEN) {
            mParameters.associatedDisplayIsExternal = getDeviceContext().isExternal();
            String8 uniqueDisplayId;
            getDeviceContext().getConfiguration().tryGetProperty(String8("touch.displayId"),
                                                                 uniqueDisplayId);
            mParameters.uniqueDisplayId = uniqueDisplayId.c_str();
        }
    }
    if (getDeviceContext().getAssociatedDisplayPort()) {
        mParameters.hasAssociatedDisplay = true;
    }

    // Initial downs on external touch devices should wake the device.
    // Normally we don't do this for internal touch screens to prevent them from waking
    // up in your pocket but you can enable it using the input device configuration.
    mParameters.wake = getDeviceContext().isExternal();
    getDeviceContext().getConfiguration().tryGetProperty(String8("touch.wake"), mParameters.wake);

}


//配置设备属性
void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded)
//mParameters.deviceType inputdevice的设备属性,有属性判断source的类型
    if (mParameters.deviceType == Parameters::DEVICE_TYPE_POINTER &&
        mConfig.pointerGesturesEnabled) {
        mSource = AINPUT_SOURCE_MOUSE;
        mDeviceMode = DEVICE_MODE_POINTER;
        if (hasStylus()) {//判断是否是鼠标类型
            mSource |= AINPUT_SOURCE_STYLUS;
        }
    } else if (mParameters.deviceType == Parameters::DEVICE_TYPE_TOUCH_SCREEN &&
               mParameters.hasAssociatedDisplay) {
        mSource = AINPUT_SOURCE_TOUCHSCREEN;
        mDeviceMode = DEVICE_MODE_DIRECT;
        if (hasStylus()) {
            mSource |= AINPUT_SOURCE_STYLUS;
        }
        if (hasExternalStylus()) {
            mSource |= AINPUT_SOURCE_BLUETOOTH_STYLUS;
        }
    } else if (mParameters.deviceType == Parameters::DEVICE_TYPE_TOUCH_NAVIGATION) {
        mSource = AINPUT_SOURCE_TOUCH_NAVIGATION;
        mDeviceMode = DEVICE_MODE_NAVIGATION;
    } else {
        mSource = AINPUT_SOURCE_TOUCHPAD;
        mDeviceMode = DEVICE_MODE_UNSCALED;
    }
    // Raw width and height in the natural orientation.kerne定义的device 原始宽高
    int32_t rawWidth = mRawPointerAxes.getRawWidth();
    int32_t rawHeight = mRawPointerAxes.getRawHeight();
	1.获取display的data根据orientation 进行surface的计算
	bool viewportChanged = mViewport != *newViewport;
    if (viewportChanged) {
        mViewport = *newViewport;

        if (mDeviceMode == DEVICE_MODE_DIRECT || mDeviceMode == DEVICE_MODE_POINTER) {
            // Convert rotated viewport to natural surface coordinates.
			//设置属性宽高
            int32_t naturalLogicalWidth, naturalLogicalHeight;
            int32_t naturalPhysicalWidth, naturalPhysicalHeight;
            int32_t naturalPhysicalLeft, naturalPhysicalTop;
            int32_t naturalDeviceWidth, naturalDeviceHeight;
            switch (mViewport.orientation) {
                case DISPLAY_ORIENTATION_90:
                    naturalLogicalWidth = mViewport.logicalBottom - mViewport.logicalTop;
                    naturalLogicalHeight = mViewport.logicalRight - mViewport.logicalLeft;
                    naturalPhysicalWidth = mViewport.physicalBottom - mViewport.physicalTop;
                    naturalPhysicalHeight = mViewport.physicalRight - mViewport.physicalLeft;
                    naturalPhysicalLeft = mViewport.deviceHeight - mViewport.physicalBottom;
                    naturalPhysicalTop = mViewport.physicalLeft;
                    naturalDeviceWidth = mViewport.deviceHeight;
                    naturalDeviceHeight = mViewport.deviceWidth;
                    break;
                case DISPLAY_ORIENTATION_180:
                    naturalLogicalWidth = mViewport.logicalRight - mViewport.logicalLeft;
                    naturalLogicalHeight = mViewport.logicalBottom - mViewport.logicalTop;
                    naturalPhysicalWidth = mViewport.physicalRight - mViewport.physicalLeft;
                    naturalPhysicalHeight = mViewport.physicalBottom - mViewport.physicalTop;
                    naturalPhysicalLeft = mViewport.deviceWidth - mViewport.physicalRight;
                    naturalPhysicalTop = mViewport.deviceHeight - mViewport.physicalBottom;
                    naturalDeviceWidth = mViewport.deviceWidth;
                    naturalDeviceHeight = mViewport.deviceHeight;
                    break;
                case DISPLAY_ORIENTATION_270:
                    naturalLogicalWidth = mViewport.logicalBottom - mViewport.logicalTop;
                    naturalLogicalHeight = mViewport.logicalRight - mViewport.logicalLeft;
                    naturalPhysicalWidth = mViewport.physicalBottom - mViewport.physicalTop;
                    naturalPhysicalHeight = mViewport.physicalRight - mViewport.physicalLeft;
                    naturalPhysicalLeft = mViewport.physicalTop;
                    naturalPhysicalTop = mViewport.deviceWidth - mViewport.physicalRight;
                    naturalDeviceWidth = mViewport.deviceHeight;
                    naturalDeviceHeight = mViewport.deviceWidth;
                    break;
                case DISPLAY_ORIENTATION_0:
                default:
                    naturalLogicalWidth = mViewport.logicalRight - mViewport.logicalLeft;
                    naturalLogicalHeight = mViewport.logicalBottom - mViewport.logicalTop;
                    naturalPhysicalWidth = mViewport.physicalRight - mViewport.physicalLeft;
                    naturalPhysicalHeight = mViewport.physicalBottom - mViewport.physicalTop;
                    naturalPhysicalLeft = mViewport.physicalLeft;
                    naturalPhysicalTop = mViewport.physicalTop;
                    naturalDeviceWidth = mViewport.deviceWidth;
                    naturalDeviceHeight = mViewport.deviceHeight;
                    break;
            }

            if (naturalPhysicalHeight == 0 || naturalPhysicalWidth == 0) {
                ALOGE("Viewport is not set properly: %s", mViewport.toString().c_str());
                naturalPhysicalHeight = naturalPhysicalHeight == 0 ? 1 : naturalPhysicalHeight;
                naturalPhysicalWidth = naturalPhysicalWidth == 0 ? 1 : naturalPhysicalWidth;
            }

			//物理宽高
            mPhysicalWidth = naturalPhysicalWidth;
            mPhysicalHeight = naturalPhysicalHeight;
            mPhysicalLeft = naturalPhysicalLeft;
            mPhysicalTop = naturalPhysicalTop;
			//设置Raw surface的信息
            mRawSurfaceWidth = naturalLogicalWidth * naturalDeviceWidth / naturalPhysicalWidth;
            mRawSurfaceHeight = naturalLogicalHeight * naturalDeviceHeight / naturalPhysicalHeight;
            mSurfaceLeft = naturalPhysicalLeft * naturalLogicalWidth / naturalPhysicalWidth;
            mSurfaceTop = naturalPhysicalTop * naturalLogicalHeight / naturalPhysicalHeight;
            mSurfaceRight = mSurfaceLeft + naturalLogicalWidth;
            mSurfaceBottom = mSurfaceTop + naturalLogicalHeight;

            mSurfaceOrientation =
                    mParameters.orientationAware ? mViewport.orientation : DISPLAY_ORIENTATION_0;
        } else {
            mPhysicalWidth = rawWidth;
            mPhysicalHeight = rawHeight;
            mPhysicalLeft = 0;
            mPhysicalTop = 0;

            mRawSurfaceWidth = rawWidth;
            mRawSurfaceHeight = rawHeight;
            mSurfaceLeft = 0;
            mSurfaceTop = 0;
            mSurfaceOrientation = DISPLAY_ORIENTATION_0;
        }
    }
	
    // Create pointer controller if needed.
    if (mDeviceMode == DEVICE_MODE_POINTER ||
        (mDeviceMode == DEVICE_MODE_DIRECT && mConfig.showTouches)) {
        if (mPointerController == nullptr) {
		//初始化pointercontroller
            mPointerController = getContext()->getPointerController(getDeviceId());
        }
    } else {
        mPointerController.clear();
    }
 if (viewportChanged || deviceModeChanged) {
       ALOGI("Device reconfigured: id=%d, name='%s', size %dx%d, orientation %d, mode %d, "
             "display id %d",
             getDeviceId(), getDeviceName().c_str(), mRawSurfaceWidth, mRawSurfaceHeight,
             mSurfaceOrientation, mDeviceMode, mViewport.displayId);

       // Configure X and Y factors.
       mXScale = float(mRawSurfaceWidth) / rawWidth;
       mYScale = float(mRawSurfaceHeight) / rawHeight;
       mXTranslate = -mSurfaceLeft;
       mYTranslate = -mSurfaceTop;
       mXPrecision = 1.0f / mXScale;
       mYPrecision = 1.0f / mYScale;

       mOrientedRanges.x.axis = AMOTION_EVENT_AXIS_X;
       mOrientedRanges.x.source = mSource;
       mOrientedRanges.y.axis = AMOTION_EVENT_AXIS_Y;
       mOrientedRanges.y.source = mSource;

       configureVirtualKeys();

       // Scale factor for terms that are not oriented in a particular axis.
       // If the pixels are square then xScale == yScale otherwise we fake it
       // by choosing an average.
       mGeometricScale = avg(mXScale, mYScale);

       // Size of diagonal axis.
       float diagonalSize = hypotf(mRawSurfaceWidth, mRawSurfaceHeight);

       // Size factors.
       if (mCalibration.sizeCalibration != Calibration::SIZE_CALIBRATION_NONE) {
           if (mRawPointerAxes.touchMajor.valid && mRawPointerAxes.touchMajor.maxValue != 0) {
               mSizeScale = 1.0f / mRawPointerAxes.touchMajor.maxValue;
           } else if (mRawPointerAxes.toolMajor.valid && mRawPointerAxes.toolMajor.maxValue != 0) {
               mSizeScale = 1.0f / mRawPointerAxes.toolMajor.maxValue;
           } else {
               mSizeScale = 0.0f;
           }

           mOrientedRanges.haveTouchSize = true;
           mOrientedRanges.haveToolSize = true;
           mOrientedRanges.haveSize = true;

           mOrientedRanges.touchMajor.axis = AMOTION_EVENT_AXIS_TOUCH_MAJOR;
           mOrientedRanges.touchMajor.source = mSource;
           mOrientedRanges.touchMajor.min = 0;
           mOrientedRanges.touchMajor.max = diagonalSize;
           mOrientedRanges.touchMajor.flat = 0;
           mOrientedRanges.touchMajor.fuzz = 0;
           mOrientedRanges.touchMajor.resolution = 0;

           mOrientedRanges.touchMinor = mOrientedRanges.touchMajor;
           mOrientedRanges.touchMinor.axis = AMOTION_EVENT_AXIS_TOUCH_MINOR;

           mOrientedRanges.toolMajor.axis = AMOTION_EVENT_AXIS_TOOL_MAJOR;
           mOrientedRanges.toolMajor.source = mSource;
           mOrientedRanges.toolMajor.min = 0;
           mOrientedRanges.toolMajor.max = diagonalSize;
           mOrientedRanges.toolMajor.flat = 0;
           mOrientedRanges.toolMajor.fuzz = 0;
           mOrientedRanges.toolMajor.resolution = 0;

           mOrientedRanges.toolMinor = mOrientedRanges.toolMajor;
           mOrientedRanges.toolMinor.axis = AMOTION_EVENT_AXIS_TOOL_MINOR;

           mOrientedRanges.size.axis = AMOTION_EVENT_AXIS_SIZE;
           mOrientedRanges.size.source = mSource;
           mOrientedRanges.size.min = 0;
           mOrientedRanges.size.max = 1.0;
           mOrientedRanges.size.flat = 0;
           mOrientedRanges.size.fuzz = 0;
           mOrientedRanges.size.resolution = 0;
       } else {
           mSizeScale = 0.0f;
       }

       // Pressure factors.
       mPressureScale = 0;
       float pressureMax = 1.0;
       if (mCalibration.pressureCalibration == Calibration::PRESSURE_CALIBRATION_PHYSICAL ||
           mCalibration.pressureCalibration == Calibration::PRESSURE_CALIBRATION_AMPLITUDE) {
           if (mCalibration.havePressureScale) {
               mPressureScale = mCalibration.pressureScale;
               pressureMax = mPressureScale * mRawPointerAxes.pressure.maxValue;
           } else if (mRawPointerAxes.pressure.valid && mRawPointerAxes.pressure.maxValue != 0) {
               mPressureScale = 1.0f / mRawPointerAxes.pressure.maxValue;
           }
       }

       mOrientedRanges.pressure.axis = AMOTION_EVENT_AXIS_PRESSURE;
       mOrientedRanges.pressure.source = mSource;
       mOrientedRanges.pressure.min = 0;
       mOrientedRanges.pressure.max = pressureMax;
       mOrientedRanges.pressure.flat = 0;
       mOrientedRanges.pressure.fuzz = 0;
       mOrientedRanges.pressure.resolution = 0;

       // Tilt
       mTiltXCenter = 0;
       mTiltXScale = 0;
       mTiltYCenter = 0;
       mTiltYScale = 0;
       mHaveTilt = mRawPointerAxes.tiltX.valid && mRawPointerAxes.tiltY.valid;
       if (mHaveTilt) {
           mTiltXCenter = avg(mRawPointerAxes.tiltX.minValue, mRawPointerAxes.tiltX.maxValue);
           mTiltYCenter = avg(mRawPointerAxes.tiltY.minValue, mRawPointerAxes.tiltY.maxValue);
           mTiltXScale = M_PI / 180;
           mTiltYScale = M_PI / 180;

           mOrientedRanges.haveTilt = true;

           mOrientedRanges.tilt.axis = AMOTION_EVENT_AXIS_TILT;
           mOrientedRanges.tilt.source = mSource;
           mOrientedRanges.tilt.min = 0;
           mOrientedRanges.tilt.max = M_PI_2;
           mOrientedRanges.tilt.flat = 0;
           mOrientedRanges.tilt.fuzz = 0;
           mOrientedRanges.tilt.resolution = 0;
       }

       // Orientation
       mOrientationScale = 0;
       if (mHaveTilt) {
           mOrientedRanges.haveOrientation = true;

           mOrientedRanges.orientation.axis = AMOTION_EVENT_AXIS_ORIENTATION;
           mOrientedRanges.orientation.source = mSource;
           mOrientedRanges.orientation.min = -M_PI;
           mOrientedRanges.orientation.max = M_PI;
           mOrientedRanges.orientation.flat = 0;
           mOrientedRanges.orientation.fuzz = 0;
           mOrientedRanges.orientation.resolution = 0;
       } else if (mCalibration.orientationCalibration !=
                  Calibration::ORIENTATION_CALIBRATION_NONE) {
           if (mCalibration.orientationCalibration ==
               Calibration::ORIENTATION_CALIBRATION_INTERPOLATED) {
               if (mRawPointerAxes.orientation.valid) {
                   if (mRawPointerAxes.orientation.maxValue > 0) {
                       mOrientationScale = M_PI_2 / mRawPointerAxes.orientation.maxValue;
                   } else if (mRawPointerAxes.orientation.minValue < 0) {
                       mOrientationScale = -M_PI_2 / mRawPointerAxes.orientation.minValue;
                   } else {
                       mOrientationScale = 0;
                   }
               }
           }

           mOrientedRanges.haveOrientation = true;

           mOrientedRanges.orientation.axis = AMOTION_EVENT_AXIS_ORIENTATION;
           mOrientedRanges.orientation.source = mSource;
           mOrientedRanges.orientation.min = -M_PI_2;
           mOrientedRanges.orientation.max = M_PI_2;
           mOrientedRanges.orientation.flat = 0;
           mOrientedRanges.orientation.fuzz = 0;
           mOrientedRanges.orientation.resolution = 0;
       }

       // Distance
       mDistanceScale = 0;
       if (mCalibration.distanceCalibration != Calibration::DISTANCE_CALIBRATION_NONE) {
           if (mCalibration.distanceCalibration == Calibration::DISTANCE_CALIBRATION_SCALED) {
               if (mCalibration.haveDistanceScale) {
                   mDistanceScale = mCalibration.distanceScale;
               } else {
                   mDistanceScale = 1.0f;
               }
           }

           mOrientedRanges.haveDistance = true;

           mOrientedRanges.distance.axis = AMOTION_EVENT_AXIS_DISTANCE;
           mOrientedRanges.distance.source = mSource;
           mOrientedRanges.distance.min = mRawPointerAxes.distance.minValue * mDistanceScale;
           mOrientedRanges.distance.max = mRawPointerAxes.distance.maxValue * mDistanceScale;
           mOrientedRanges.distance.flat = 0;
           mOrientedRanges.distance.fuzz = mRawPointerAxes.distance.fuzz * mDistanceScale;
           mOrientedRanges.distance.resolution = 0;
       }

       // Compute oriented precision, scales and ranges.
       // Note that the maximum value reported is an inclusive maximum value so it is one
       // unit less than the total width or height of surface.
       switch (mSurfaceOrientation) {
           case DISPLAY_ORIENTATION_90:
           case DISPLAY_ORIENTATION_270:
               mOrientedXPrecision = mYPrecision;
               mOrientedYPrecision = mXPrecision;

               mOrientedRanges.x.min = mYTranslate;
               mOrientedRanges.x.max = mRawSurfaceHeight + mYTranslate - 1;
               mOrientedRanges.x.flat = 0;
               mOrientedRanges.x.fuzz = 0;
               mOrientedRanges.x.resolution = mRawPointerAxes.y.resolution * mYScale;

               mOrientedRanges.y.min = mXTranslate;
               mOrientedRanges.y.max = mRawSurfaceWidth + mXTranslate - 1;
               mOrientedRanges.y.flat = 0;
               mOrientedRanges.y.fuzz = 0;
               mOrientedRanges.y.resolution = mRawPointerAxes.x.resolution * mXScale;
               break;

           default:
               mOrientedXPrecision = mXPrecision;
               mOrientedYPrecision = mYPrecision;

               mOrientedRanges.x.min = mXTranslate;
               mOrientedRanges.x.max = mRawSurfaceWidth + mXTranslate - 1;
               mOrientedRanges.x.flat = 0;
               mOrientedRanges.x.fuzz = 0;
               mOrientedRanges.x.resolution = mRawPointerAxes.x.resolution * mXScale;

               mOrientedRanges.y.min = mYTranslate;
               mOrientedRanges.y.max = mRawSurfaceHeight + mYTranslate - 1;
               mOrientedRanges.y.flat = 0;
               mOrientedRanges.y.fuzz = 0;
               mOrientedRanges.y.resolution = mRawPointerAxes.y.resolution * mYScale;
               break;
       }

       // Location
       updateAffineTransformation();

       if (mDeviceMode == DEVICE_MODE_POINTER) {
           // Compute pointer gesture detection parameters.
           float rawDiagonal = hypotf(rawWidth, rawHeight);
           float displayDiagonal = hypotf(mRawSurfaceWidth, mRawSurfaceHeight);

           // Scale movements such that one whole swipe of the touch pad covers a
            // given area relative to the diagonal size of the display when no acceleration
            // is applied.
            // Assume that the touch pad has a square aspect ratio such that movements in
            // X and Y of the same number of raw units cover the same physical distance.
            mPointerXMovementScale =
                    mConfig.pointerGestureMovementSpeedRatio * displayDiagonal / rawDiagonal;// move因子  确定鼠标icon的计算值
            mPointerYMovementScale = mPointerXMovementScale;

            // Scale zooms to cover a smaller range of the display than movements do.
            // This value determines the area around the pointer that is affected by freeform
            // pointer gestures.
            mPointerXZoomScale =
                    mConfig.pointerGestureZoomSpeedRatio * displayDiagonal / rawDiagonal;
            mPointerYZoomScale = mPointerXZoomScale;//手势因子

            // Max width between pointers to detect a swipe gesture is more than some fraction
            // of the diagonal axis of the touch pad.  Touches that are wider than this are
            // translated into freeform gestures.
            mPointerGestureMaxSwipeWidth = mConfig.pointerGestureSwipeMaxWidthRatio * rawDiagonal;

            // Abort current pointer usages because the state has changed.
            abortPointerUsage(when, 0 /*policyFlags*/);
        }

        // Inform the dispatcher about the changes.
        *outResetNeeded = true;
        bumpGeneration();
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值