繁体   English   中英

如何将点击监听器添加到轮播项目

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM