作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经按照本指南使用 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 函数,但不会执行我的 onSwipe 转换。
我的问题是,为 Carousel 项目设置 onClick 函数的正确方法是什么?
在寻找答案时,我看到了一些引用了 Carousel.setOnItemClickListener()
的帖子。这正是我需要的,但它似乎已被弃用。
我还看到帖子说要覆盖 onTouchListener 并在 ACTION_UP 事件上运行您的 onClick 代码。我已经尝试了此代码 fragment 的几个变体,但无法使其正常工作:
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 类。拦截滑动事件
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
}
}
为我工作
关于android - 如何将点击监听器添加到轮播项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72246172/
我是一名优秀的程序员,十分优秀!