RecyclerView 单元格可以使用 RecyclerViews 触摸事件吗?
Can a RecyclerView cell consume RecyclerViews touch events?
我有一个 RecyclerView,其中所有单元格都是自定义视图。在我的自定义视图中,我有一些看起来像按钮的东西。并且当用户长按这个按钮时he/she可以做出滑动手势。
但是当用户滑动 RecyclerView 时会上下滚动。
我的自定义视图可以在 RecyclerView 开始滚动之前使用这个滑动手势吗?
在我的自定义视图中,我实现了 GestureDetector
. It works so far for click and long press. I also overwrote boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
和 return true
以指示滚动事件已消耗但 RecyclerView 仍然滚动。
编辑:
这是我的代码(片段):
class EventListView(context: Context, attrs: AttributeSet) : View(context, attrs),
GestureDetector. OnGestureListener, GestureDetector.OnDoubleTapListener {
private val gestureDetector: GestureDetector
init {
gestureDetector = GestureDetector(context, this)
}
override fun onTouchEvent(event: MotionEvent?): Boolean {
var result = gestureDetector.onTouchEvent(event);
if (!result) {
if (event?.action == MotionEvent.ACTION_UP ) {
Timber.i("ACTION_UP")
animateAlpha(alpha, 0)
result = true;
}
}
return result;
}
//
// OnGestureListener
//
override fun onDown(e: MotionEvent): Boolean {
return isInside(e)
}
override fun onShowPress(e: MotionEvent) {
if (isInside(e))
showPressState()
}
override fun onSingleTapUp(e: MotionEvent): Boolean {
return false
}
override fun onLongPress(e: MotionEvent) {
}
override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean {
return true
}
override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
return true
}
//
// OnDoubleTapListener
//
override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
return false
}
override fun onDoubleTap(e: MotionEvent): Boolean {
return false
}
override fun onDoubleTapEvent(e: MotionEvent): Boolean {
return false
}
}
好的,我知道了。当我在自定义视图中调用 getParent().requestDisallowInterceptTouchEvent(true)
时,RecyclerView 停止滚动
我有一个 RecyclerView,其中所有单元格都是自定义视图。在我的自定义视图中,我有一些看起来像按钮的东西。并且当用户长按这个按钮时he/she可以做出滑动手势。
但是当用户滑动 RecyclerView 时会上下滚动。
我的自定义视图可以在 RecyclerView 开始滚动之前使用这个滑动手势吗?
在我的自定义视图中,我实现了 GestureDetector
. It works so far for click and long press. I also overwrote boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
和 return true
以指示滚动事件已消耗但 RecyclerView 仍然滚动。
编辑:
这是我的代码(片段):
class EventListView(context: Context, attrs: AttributeSet) : View(context, attrs),
GestureDetector. OnGestureListener, GestureDetector.OnDoubleTapListener {
private val gestureDetector: GestureDetector
init {
gestureDetector = GestureDetector(context, this)
}
override fun onTouchEvent(event: MotionEvent?): Boolean {
var result = gestureDetector.onTouchEvent(event);
if (!result) {
if (event?.action == MotionEvent.ACTION_UP ) {
Timber.i("ACTION_UP")
animateAlpha(alpha, 0)
result = true;
}
}
return result;
}
//
// OnGestureListener
//
override fun onDown(e: MotionEvent): Boolean {
return isInside(e)
}
override fun onShowPress(e: MotionEvent) {
if (isInside(e))
showPressState()
}
override fun onSingleTapUp(e: MotionEvent): Boolean {
return false
}
override fun onLongPress(e: MotionEvent) {
}
override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean {
return true
}
override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
return true
}
//
// OnDoubleTapListener
//
override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
return false
}
override fun onDoubleTap(e: MotionEvent): Boolean {
return false
}
override fun onDoubleTapEvent(e: MotionEvent): Boolean {
return false
}
}
好的,我知道了。当我在自定义视图中调用 getParent().requestDisallowInterceptTouchEvent(true)
时,RecyclerView 停止滚动