Android停止(结束)惯性滚动

场景:当页面滚动超过一定距离后,显示回到顶部的按钮,点击按钮平滑滚动回顶部。

实现:监听页面滚动距离,与一特定值比较,控制按钮显示隐藏,点击按钮点用页面平滑滚动Api或者通过自定动画实现滚动。

存在问题:惯性滚动在页面返回顶部后并未结束,导致继续滚行下滑,使得页面无法停留在置顶状态。

解决方法:未找到有效的自带Api实现停止惯性滚动,所以考虑使用模拟点击的方式停止页面滚动。

  1. 使用MotionEventobtain(long downTime, long eventTime, int action,float x, float y, int metaState)方法创建一个页面内的MotionEvent.ACTION_DOWN事件,调用页面视图的dispatchTouchEvent(MotionEvent ev)传递事件

  2. 使用MotionEventobtain(long downTime, long eventTime, int action,float x, float y, int metaState)方法创建一个页面内的MotionEvent.ACTION_CANCEL事件,调用页面视图的dispatchTouchEvent(MotionEvent ev)传递事件

kotlin代码示例:

scrollView?.let {
    val event1 = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_DOWN,
            (it.right - it.left) / 2f, (it.bottom - it.top) / 2f, 0)
    it.dispatchTouchEvent(event1)
    val event2 = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_CANCEL,
            (it.right - it.left) / 2f, (it.bottom - it.top) / 2f, 0)
    it.dispatchTouchEvent(event2)
    it.smoothScrollTo(0, 0)
}
posted @ 2020-10-09 19:10  FirstLetterZ  阅读(844)  评论(0)    收藏  举报