簡體   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