如何给轮播项添加点击事件监听器

4

我使用MotionLayout创建了一个旋转木马,按照此指南进行操作:https://developer.android.com/training/constraint-layout/motionlayout/carousel

我已经成功实现了指南中的所有内容——我可以通过滑动浏览旋转木马中的项。

然而,我在尝试向旋转木马的项添加一个onClickListner时遇到了问题。我已经尝试在适配器中设置onClickListner:

carousel.setAdapter(object : Carousel.Adapter {
  override fun populate(view: View?, index: Int) {
    view.setOnClickListener {
      // do something
    }
  }
})

然而,这会使得轮播对滑动操作不响应。当我尝试滑动轮播时,它会执行我的onClick函数,但不会执行我的onSwipe过渡效果。
我的问题是,如何为Carousel项目设置适当的onClick函数?
在寻找答案时,我看到了一些帖子引用了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()
    }
  }
})

非常感激您的帮助!

1个回答

4

没有更好的解决方案

你可以像这样覆盖父级MotionLayout类。拦截滑动事件。

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
    }


}
对我有用

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接