gpt4 book ai didi

Android Kotlin 子级 onClick 会阻塞父级 OnTouch

转载 作者:太空狗 更新时间:2023-10-29 14:00:19 28 4
gpt4 key购买 nike

我有这个布局层次结构:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/parent"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.xxxxxx.Widget
android:id="@+id/widget1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

<com.xxxxxx.Widget
android:id="@+id/widget2"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>

我有这样的父 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)
}


}
}

基本上,这将检测父级上的“向上滚动”事件,并将执行一些动画。问题是,一旦我为 widget1 和 widget2 设置了点击监听器,父级的触摸事件就不再起作用。有什么解决方法吗?

最佳答案

唯一对我有用的是:在父 LinearLayout 中,拦截触摸,调用 onTouchEvent 并返回 false:

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

将带有 Gesture Detector 类的 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

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

关于Android Kotlin 子级 onClick 会阻塞父级 OnTouch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36065388/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com