Android Kotlin子onClick阻止父OnTouch

我有这个布局层次结构:

     

我已经触摸父LinearLayout事件像这样:

 parent.setOnTouchListener(myCustomTouchParent) class MyCustomTouchParent(ctx: Context): View.OnTouchListener { private var isScrollingDown = false private var isScrollingUp = false private val myGestureDetected = GestureDetector(ctx, MyGestureListener()) var onRecyclerViewMovingDown: (() -> Unit)? = null override fun onTouch(p0: View?, e: MotionEvent): Boolean { myGestureDetected.onTouchEvent(e) when(e.action){ MotionEvent.ACTION_UP -> { if (isScrollingDown) { onRecyclerViewMovingDown?.invoke() } } MotionEvent.ACTION_DOWN -> { Log.i("TAg", "Action Down") isScrollingDown = false isScrollingUp = false } } return true } inner class MyGestureListener: GestureDetector.SimpleOnGestureListener() { override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean { if(e2.y - e1.y > 0){ isScrollingUp = true } else if(e2.y - e1.y < 0){ isScrollingDown = true } return super.onScroll(e1, e2, distanceX, distanceY) } } } 

基本上,这会检测父母上的“向上滚动”事件,并执行一些animation。 问题是,只要我为widget1和widget2设置了一个点击监听器,父项的触摸事件就不再起作用了。 有没有解决方法?

唯一对我有效的方法是:在父LinearLayout中,拦截touch,调用onTouchEvent并返回false:

 override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { onTouchEvent(ev) return false } 

将具有手势检测器类的TouchInterceptor移动到父级onTouchEvent:

 override fun onTouchEvent(e: MotionEvent): Boolean { myGestureDetected.onTouchEvent(e) when(e.action){ MotionEvent.ACTION_UP -> { if (isScrollingDown) { onRecyclerViewMovingDown?.invoke() } } MotionEvent.ACTION_DOWN -> { isScrollingDown = false isScrollingUp = false } } return super.onTouchEvent(e) } 

我不知道有没有更好的解决办法,但是这个让我先处理父母的触摸事件,然后把触摸传递给孩子。 在那里你可以设置你的点击监听器。

此外,如果您不设置点击侦听器,则包含可点击项目的触摸区域将不会触发触摸。 所以,更好的设置

 clickable=true 

在所有的项目中,然后只在需要时设置监听器。

你必须重写你的子视图上的两个onTouchListeners,并返回false,这将使他们不覆盖他们的父母ontouch。

 widget1.onTouch { view, motionEvent -> return@onTouch false } widget2.onTouch { view, motionEvent -> return@onTouch false }