Evento táctil de interceptación y networkingirigirlo en function del estado del evento de movimiento

Creé una vista personalizada en Android que henetworkinga de RelativeLayout. Dentro de esta vista hay un OverScroller que se usa para manejar el desplazamiento de la vista cuando ocurre un evento táctil:

class MyCustomView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : RelativeLayout(context, attrs, defStyleAttr) { constructor(context: Context) : this(context, null, 0) constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0) private val scroller = OverScroller(context, FastOutLinearInInterpolator()) private var currentY = 0 private val gestureDetector = GestureDetectorCompat(context, object : GestureDetector.SimpleOnGestureListener() { override fun onDown(event: MotionEvent?): Boolean { // Stop the current scroll animation scroller.forceFinished(true) // Invalidate the view ViewCompat.postInvalidateOnAnimation(this@MyCustomView) return true } override fun onScroll(event1: MotionEvent?, event2: MotionEvent?, distanceX: Float, distanceY: Float): Boolean { scroller.forceFinished(true) currentY -= distanceY.toInt() ViewCompat.postInvalidateOnAnimation(this@MyCustomView) return true } override fun onFling(e1: MotionEvent?, e2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean { // Stop any scrolling scroller.forceFinished(true) scroller.fling(0, currentY, 0, velocityY.toInt(), 0, 0, -5000 + height, 0) // Invalidate the view ViewCompat.postInvalidateOnAnimation(this@MyCustomView) return true } }) @SuppressLint("ClickableViewAccessibility") override fun onTouchEvent(event: MotionEvent?): Boolean { if (event == null) return false // Return the value from the gesture detector return gestureDetector.onTouchEvent(event) } override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) // Draw stuff to canvas, using currentY as origin } override fun computeScroll() { // Call to super class method super.computeScroll() if (scroller.computeScrollOffset()) { currentY = scroller.currY } // Invalidate the view ViewCompat.postInvalidateOnAnimation(this@MyCustomView) } } 

Esto funciona bien Luego, agregué un grupo de vistas RelativeLayout para mantener una carga de celdas infladas. Estas celdas son clicables. Ahora, cuando bash iniciar un desplazamiento con el primer toque en una de estas celdas infladas, la celda se traga el evento click (la vista principal con el desplazamiento nunca onTouchEvent llama a onTouchEvent y por lo tanto no se desplaza).

Importante: el grupo de vista RelativeLayout que contiene las celdas es una vista child de MyCustomView .

He intentado replace onInterceptTouchEvent en MyCustomView para interceptar el evento táctil antes de enviarlo a cualquiera de las vistas:

 override fun onInterceptTouchEvent(event: MotionEvent?): Boolean { if (event == null) return false if (event.action == MotionEvent.ACTION_UP) { if (event.historySize > 0) { val startY = event.getHistoricalY(0) val endY = event.getHistoricalY(event.historySize - 1) val distance = Math.abs(endY - startY).toInt() if (distance == 0) { // Consider this a click (so don't swallow it return false } } } // Ok this isn't a click, so call this views onTouchEvent return this.onTouchEvent(event) } 

Luego determino si el código de acción del evento táctil es ACTION_UP , si es que calculo la distancia total entre ACTION_DOWN y ACTION_UP y, si está en un range lo suficientemente pequeño, lo trato como un clic y llamo a super.onInterceptTouchEvent(event) (que hará clic en una celda inflada si el evento estaba en una celda, de lo contrario terminará llamando a onTouchEvent que controlará el desplazamiento. Si el código de acción del evento no fue ACTION_UP O la distancia movida no fue lo suficientemente pequeña, se devolverá this.onTouchEvent(event) .

El problema que tengo es que mi solución no funciona, aún no se puede iniciar el desplazamiento al iniciar el desplazamiento en la parte superior de una celda inflada.

¿Alguien sabe lo que me estoy perdiendo?