【问题标题】:How to manually create Android MotionEvents for a pinch gesture如何为捏合手势手动创建 Android MotionEvents
【发布时间】:2023-01-04 03:08:57
【问题描述】:

我一直在寻找创建 Android MotionEvents 来模拟捏合(缩放)手势。没有任何好的文档,所以我在下面添加我的解决方案。

【问题讨论】:

    标签: android motionevent


    【解决方案1】:

    生成 MotionEvent 需要很多参数,所以我创建了这个方法来简化生成我需要的事件(在我的例子中,两个指针事件在 X 轴上相互靠近或远离:

    private fun generateMotionEvent(animationStart: Long, centerX: Float, xOffset: Float, y: Float) : MotionEvent {
        val pointerProperties = arrayOf(PointerProperties(), PointerProperties())
        pointerProperties[0].id = 0
        pointerProperties[1].id = 1
        val pointerCoords = arrayOf(MotionEvent.PointerCoords(), MotionEvent.PointerCoords())
        pointerCoords[0].x = centerX - xOffset
        pointerCoords[0].y = y
        pointerCoords[1].x = centerX + xOffset
        pointerCoords[1].y = y
        return MotionEvent.obtain(
            animationStart,             // downTime
            SystemClock.uptimeMillis(), // eventTime
            MotionEvent.ACTION_MOVE,    // action
            2, // pointerCount
            pointerProperties, // PointerProperties[] pointerProperties
            pointerCoords, // PointerCoords[] pointerCoords
            0,  // int metaState
            0,  // int buttonState
            1F, // float xPrecision
            1F, // float yPrecision
            0,  // int deviceId
            0,  // int edgeFlags
            0,  // int source
            0   // int flags
        )
    }
    

    然后我需要一系列事件来触发 ScaleGestureDetector。 (两个指针向下,捏合,然后两个指针向上)这是所需内容的快速版本。

    向下指针:

    val leftFingerDownEvent = MotionEvent.obtain(animationStart, animationStart, MotionEvent.ACTION_DOWN,
        leftFinger.x, leftFinger.y, 0)
    targetView.dispatchTouchEvent(leftFingerDownEvent)
    val rightFingerDownAction = MotionEvent.ACTION_POINTER_DOWN or (1 shl MotionEvent.ACTION_POINTER_INDEX_SHIFT)
    val rightFingerDownEvent = generateMotionEvent(animationStart, fingerX, initialFingerSpacing.toFloat(), fingerY)
    rightFingerDownEvent.action = rightFingerDownAction
    targetView.dispatchTouchEvent(rightFingerDownEvent)
    

    运动(在我的例子中,在 ObjectAnimator 中):

    val event = generateMotionEvent(animationStart, fingerX, fingerX - value, fingerY)
    targetView.dispatchTouchEvent(event)
    

    指针向上:

    val rightFingerUpAction = MotionEvent.ACTION_POINTER_UP or (1 shl MotionEvent.ACTION_POINTER_INDEX_SHIFT)
    val rightFingerUpEvent = generateMotionEvent(animationStart, fingerX, initialFingerSpacing.toFloat(), fingerY)
    rightFingerUpEvent.action = rightFingerUpAction
    audioView.dispatchTouchEvent(rightFingerUpEvent)
    val leftFingerUpEvent = MotionEvent.obtain(animationStart, SystemClock.uptimeMillis(),
        MotionEvent.ACTION_UP, leftFinger.x, leftFinger.y, 0)
    targetView.dispatchTouchEvent(leftFingerUpEvent)
    

    我认为值得为后代留下这个答案,以防其他人遇到类似的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 2018-12-02
      • 1970-01-01
      相关资源
      最近更新 更多