Android 如何在顶层视图上接收拖动事件,但通过单击传递?

Android 如何在顶层视图上接收拖动事件,但通过单击传递?,android,android-touch-event,Android,Android Touch Event,该应用程序有一些接收点击的UI,例如一个接收焦点的编辑文本,以及一个触发动作的按钮(不在下面的屏幕截图中)。但是整个用户界面也需要滑动到侧面,以显示下面的视图。我将其实现为一个包含UI并在拖动时移动(可见)的视图,以及一个不可见但收集拖动输入的顶层视图 下面的代码的部分工作原理是,当拖动不可见视图时,可见视图会拖动,它可以感知拖动和单击之间的差异,但尽管在View.OnTouchListener.onTouch()中返回false,但不可见可拖动视图下的视图不会接收到单击 我如何让点击通过下面的

该应用程序有一些接收点击的UI,例如一个接收焦点的编辑文本,以及一个触发动作的按钮(不在下面的屏幕截图中)。但是整个用户界面也需要滑动到侧面,以显示下面的视图。我将其实现为一个包含UI并在拖动时移动(可见)的视图,以及一个不可见但收集拖动输入的顶层视图

下面的代码的部分工作原理是,当拖动不可见视图时,可见视图会拖动,它可以感知拖动和单击之间的差异,但尽管在View.OnTouchListener.onTouch()中返回false,但不可见可拖动视图下的视图不会接收到单击

我如何让点击通过下面的视图,而不干扰工作拖动功能

import android.view.MotionEvent
import android.view.View

class ViewHorizontalSlider(dragView: View,
                           private val moveView: View,
                           private val distancePx: Int = 100) {

    private var xPos = 0f
    private var downX = 0f
    private var isOnClick = false
    private val scrollThreshold = 6

    init {
         dragView.setOnTouchListener { _, event ->
            when (event.actionMasked) {
                MotionEvent.ACTION_DOWN -> {
                    downX = event.x
                    xPos = moveView.x - event.rawX
                    isOnClick = true
                    return@setOnTouchListener true
                }
                MotionEvent.ACTION_MOVE -> {
                    var newX = event.rawX + xPos
                    if (newX > distancePx) newX = distancePx.toFloat()
                    if (newX < 0) newX = 0f
                    moveView.x = newX

                    val movement = Math.abs(downX - event.x)
                    if (isOnClick && (movement > scrollThreshold)) {
                        isOnClick = false;
                    }
                    return@setOnTouchListener true
                }
                MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                    if (isOnClick) {
                        return@setOnTouchListener false
                    } else {
                        return@setOnTouchListener true
                    }
                } else -> {
                    return@setOnTouchListener false
            }
            }
        }
    }
导入android.view.MotionEvent
导入android.view.view
类ViewHorizontalSlider(dragView:View,
私有视图:视图,
专用val距离px:Int=100){
私有变量xPos=0f
专用变量downX=0f
私有变量isOnClick=false
私有值阈值=6
初始化{
dragView.setOnTouchListener{},事件->
何时(event.actionMasked){
MotionEvent.ACTION\u向下->{
downX=event.x
xPos=moveView.x-event.rawX
isOnClick=true
return@setOnTouchListener真的
}
MotionEvent.ACTION\u MOVE->{
var newX=event.rawX+xPos
如果(newX>distancePx)newX=distancePx.toFloat()
如果(newX<0)newX=0f
moveView.x=newX
val movement=Math.abs(downX-event.x)
如果(isOnClick&(移动>滚动阈值)){
isOnClick=false;
}
return@setOnTouchListener真的
}
MotionEvent.ACTION\u向上,MotionEvent.ACTION\u取消->{
如果(isOnClick){
return@setOnTouchListener假的
}否则{
return@setOnTouchListener真的
}
}其他->{
return@setOnTouchListener假的
}
}
}
}
在屏幕截图中,“P1”等为编辑文本视图。整个彩色面板应可向右拖动(如P1,以显示删除UI),但也可单击(在不可见的覆盖拖动视图上)但是请关注下面的编辑文本。我希望在上面的代码中只返回false,但这似乎不足以让单击通过

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="72dp"
    >

    <ImageView
        android:id="@+id/delete"
        android:layout_width="@dimen/perspective_delete_slide"
        android:layout_height="match_parent"
        android:src="@drawable/ic_delete"
        android:scaleType="center"
        android:background="@color/black_light"
        android:contentDescription="@string/delete_perspective"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

    <android.support.constraint.ConstraintLayout
        android:id="@+id/container"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:focusableInTouchMode="true"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        tools:layout_marginStart="72dp"
        >

        <EditText
            android:id="@+id/name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:background="@null"
            android:inputType="text|textCapSentences"
            android:layout_marginStart="12dp"
            android:layout_marginEnd="12dp"
            android:visibility="visible"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/marker"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            />

        <View
            android:id="@+id/marker"
            android:layout_width="8dp"
            android:layout_height="match_parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@id/name"
            app:layout_constraintTop_toTopOf="parent"
            />

        <View
            android:id="@+id/draggable"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:clickable="false"
            android:focusable="false"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            />

    </android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>

如果你想在滑动中显示菜单,那么你需要这个或类似的功能

用户界面没有使用RecyclerView,我们也不想使用库来实现这一功能,这是非常具体的功能。请注意,滑动是为了显示,而不是为了删除-滑动仅限于显示删除选项,然后需要单击删除按钮删除。我正在寻找关于我发布的代码的反馈,而不是可能满足或可能不满足要求的第三方库(特别是允许通过可拖动的UI段进行单击)。我找不到修复代码的方法,AndroidSwipeLayout实际上非常适合,可以处理点击传递。谢谢。我已经尝试在下面的移动视图和上面的可拖动视图之间创建另一个中间视图,当检测到点击时,使用x/y创建运动事件,并将其分派给点击捕捉器在中间看,但这似乎不起作用。试图找出同样的事情。