[英]How to add click listener to Carousel item
我按照本指南使用 MotionLayout 創建了一個 Carousel: https://developer.android.com/training/constraint-layout/motionlayout/carousel
我已經從本指南中獲得了一切 - 我可以在項目輪播中滑動。
但是,我在將 onClickListener 添加到輪播項目時遇到了問題。 我試過像這樣在適配器中設置 onClickListener:
carousel.setAdapter(object : Carousel.Adapter {
override fun populate(view: View?, index: Int) {
view.setOnClickListener {
// do something
}
}
})
但是,這會使輪播對滑動沒有反應。 當我嘗試滑動輪播時,它會執行我的 onClick function 但不會執行我的 onSwipe 轉換。
我的問題是,為輪播項目設置 onClick function 的正確方法是什么?
在尋找答案時,我看到了一些引用Carousel.setOnItemClickListener()
的帖子。 這正是我所需要的,但它似乎已被棄用。
我還看到帖子說要覆蓋 onTouchListener 並在 ACTION_UP 事件上運行您的 onClick 代碼。 我已經嘗試了這個代碼片段的幾個變體,但一直無法讓它工作:
carousel.setAdapter(object : Carousel.Adapter {
override fun populate(view: View?, index: Int) {
view.setOnTouchListener { view, motionEvent ->
if(motionEvent.action == MotionEvent.ACTION_UP) {
// do something
}
view.performClick()
}
}
})
非常感謝任何幫助!
沒有更好的解決方案
您可以像這樣覆蓋父 MotionLayout class。攔截幻燈片事件
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.constraintlayout.motion.widget.MotionLayout
import kotlin.math.abs
/**
* @author : litao
* @email : onresume@live.com
* @date : 2022/5/31 5:31 下午
*/
class TestMotionLayout constructor(
context: Context,
attrs: AttributeSet?,
defStyleAttr: Int,
) : MotionLayout(context, attrs, defStyleAttr) {
private var mInitX = 0f
private var mInitY = 0f
private var mTouchSlop = 10
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
when (ev.actionMasked) {
MotionEvent.ACTION_DOWN -> {
mInitX = ev.x
mInitY = ev.y
}
MotionEvent.ACTION_MOVE -> {
val moveX = abs(x - mInitX)
val moveY = abs(y - mInitY)
if (moveX > mTouchSlop || moveY > mTouchSlop){
val obtain = MotionEvent.obtain(ev)
obtain.action = MotionEvent.ACTION_DOWN
dispatchTouchEvent(obtain)
onTouchEvent(obtain)
return true
}
}
MotionEvent.ACTION_UP -> {
}
}
return false
}
}
為我工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.