【问题标题】:Android TouchEvent ModifyAndroid TouchEvent 修改
【发布时间】:2013-08-29 07:38:44
【问题描述】:

我正在使用 ViewPager 尝试完成一些动画。其中之一是尝试从左向右滑动(视图寻呼机的默认转换是从右向左)。我已经做到了。

我的问题是我想“破解”触摸事件,所以我不需要修改视图寻呼机。例如,对于从左到右的转换,我将希望在传递给视图分页器的触摸事件中使用 X 进行某种镜像。

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    event.setX(Math.abs(event.getX() - getWidth());
    return super.onInterceptTouchEvent(event);
}

【问题讨论】:

  • 看看pagetransformer。
  • 是的,我已经很好地完成了过渡。现在我希望它对触摸动作有意义。当我从右到左进行触摸移动时,我不希望从左到右过渡。

标签: android android-viewpager android-animation


【解决方案1】:

我终于做到了。

public boolean dispatchTouchEvent(MotionEvent event) {
    MotionEvent hackedEvent = MotionEvent.obtain(event.getDownTime(),
            event.getEventTime(), event.getAction(), (event.getX() - getWidth()) * -1,
            event.getY(), event.getMetaState());
    boolean result = super.dispatchTouchEvent(hackedEvent);
    hackedEvent.recycle();
    return result;
};

【讨论】:

    【解决方案2】:

    对于有相同问题并使用 Kotlin 的人:

    我创建了一个扩展函数,以数据类样式复制整个 MotionEvent,它允许您修改它的某些属性。

    例如

    val modifiedEvent = event.copy(downTime = System.currentTimeMillis())
    event.recycle()
    

    扩展功能:

    /**
     * Copies a whole MotionEvent. Use the named parameters to modify certain 
    values.
     * Don't forget to recycle the original event (if it is not used anymore :) 
    )!
     */
    fun MotionEvent.copy(
        downTime: Long = getDownTime(),
        eventTime: Long = getEventTime(),
        action: Int = getAction(),
        pointerCount: Int = getPointerCount(),
        pointerProperties: Array<MotionEvent.PointerProperties>? =
            (0 until getPointerCount())
                .map { index ->
                    MotionEvent.PointerProperties().also { pointerProperties ->
                        getPointerProperties(index, pointerProperties)
                    }
                }
                .toTypedArray(),
        pointerCoords: Array<MotionEvent.PointerCoords>? =
            (0 until getPointerCount())
                .map { index ->
                    MotionEvent.PointerCoords().also { pointerCoords ->
                        getPointerCoords(index, pointerCoords)
                    }
                }
                .toTypedArray(),
        metaState: Int = getMetaState(),
        buttonState: Int = getButtonState(),
        xPrecision: Float = getXPrecision(),
        yPrecision: Float = getYPrecision(),
        deviceId: Int = getDeviceId(),
        edgeFlags: Int = getEdgeFlags(),
        source: Int = getSource(),
        flags: Int = getFlags()
    ): MotionEvent =
        MotionEvent.obtain(
            downTime,
            eventTime,
            action,
            pointerCount,
            pointerProperties,
            pointerCoords,
            metaState,
            buttonState,
            xPrecision,
            yPrecision,
            deviceId,
            edgeFlags,
            source,
            flags
        )
    

    来源:https://gist.github.com/sebschaef/b803da53217c88e8c691aeed08602193

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • @DaFois 你是对的。我编辑了我的答案并直接在此处添加了代码。
    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多