我有一个自定义的ViewPager
,它使用taps, long press
检测long press up
和GestureDetector
事件。它还允许擦除ViewPager
。
手势侦听器很简单:
private inner class GestureListener : GestureDetector.SimpleOnGestureListener() {
override fun onDown(e: MotionEvent?) = true
override fun onLongPress(e: MotionEvent?) {
mTouchListener.invoke(TAPEVENT.LONGTAP)
mWasLongTap = true
}
override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {
mTouchListener.invoke(TAPEVENT.TAP)
return true
}
override fun onSingleTapUp(e: MotionEvent?): Boolean {
if (mWasLongTap) {
mWasLongTap = false
mTouchListener.invoke(TAPEVENT.LONGTAPUP)
}
return true
}
}
//override view group methods
override fun onTouchEvent(ev: MotionEvent?): Boolean {
super.onTouchEvent(ev)
return mDetector.onTouchEvent(ev)
}
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
mDetector.onTouchEvent(ev)
return super.dispatchTouchEvent(ev)
}
我在fragments
中有ViewPager
。可以说,在我的fragments
中,有一个Button
视图。
单击我的按钮时,onSingleTapConfirmed
事件也会被触发。
如果在片段的子视图上单击,则无法弄清楚该如何强制ViewPager不处理事件。
Fragment
视图看起来像这样:
<CoordinatorLayout>
<View>
</View>
<Button>
</Button>
</CoordinatorLayout>
答案 0 :(得分:0)
我最终得到了这样的解决方案。
GestureListener
是相同的,但是onTouchEvent
被替代。
override fun onTouchEvent(ev: MotionEvent): Boolean {
if (ev.action == MotionEvent.ACTION_UP && mWasLongTap) {
mWasLongTap = false
mTouchListener.invoke(TAPEVENT.LONGTAPUP)
}
return mDetector.onTouchEvent(ev) || super.onTouchEvent(ev)
}