Java 滑动检测和触摸侦听器在片段内不工作
应用程序有底部导航菜单和片段。这是需要滑动检测的片段,类似于Tinder:Java 滑动检测和触摸侦听器在片段内不工作,java,android,kotlin,Java,Android,Kotlin,应用程序有底部导航菜单和片段。这是需要滑动检测的片段,类似于Tinder: class HomeFragment : Fragment() { private lateinit var homeViewModel: HomeViewModel override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
class HomeFragment : Fragment() {
private lateinit var homeViewModel: HomeViewModel
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
homeViewModel =
ViewModelProvider(this).get(HomeViewModel::class.java)
val root = inflater.inflate(R.layout.fragment_home, container, false)
val textView: TextView = root.findViewById(R.id.text_home)
homeViewModel.text.observe(viewLifecycleOwner, {
textView.text = it
})
root.setOnTouchListener(object : OnSwipeTouchListener(requireContext()) {
override fun onSwipeRight() {
Toast.makeText(requireContext(), "Swiped right!", Toast.LENGTH_SHORT).show()
}
override fun onSwipeLeft() {
Toast.makeText(requireContext(), "Swiped left!", Toast.LENGTH_SHORT).show()
}
})
return root
}
}
该应用程序需要像Tinder这样的滑动功能。
以下是侦听器类:
open class OnSwipeTouchListener(ctx: Context) : OnTouchListener {
val gestureDetector: GestureDetector
companion object {
private val SWIPE_THRESHOLD = 100
private val SWIPE_VELOCITY_THRESHOLD = 100
}
init {
gestureDetector = GestureDetector(ctx, GestureListener())
}
override fun onTouch(v: View, event: MotionEvent): Boolean {
var isTouch = false
if (gestureDetector != null && event != null) {
isTouch = gestureDetector.onTouchEvent(event)
} else {
isTouch = true
}
return isTouch
}
inner class GestureListener : SimpleOnGestureListener() {
override fun onDown(e: MotionEvent): Boolean {
return false
}
override fun onFling(e1: MotionEvent?, e2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean {
var result = false
try {
val diffY = e1?.y?.let { e2?.y?.minus(it) }
val diffX = e1?.x?.let { e2?.x?.minus(it) }
if (diffX != null && diffY != null) {
if (abs(diffX) > abs(diffY)) {
if (abs(diffX) > SWIPE_THRESHOLD && abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
onSwipeRight()
} else {
onSwipeLeft()
}
result = true
}
}
} else {
onSwipeRight()
result = true
}
} catch (exception: Exception) {
exception.printStackTrace()
}
return result
}
}
open fun onSwipeRight() {}
open fun onSwipeLeft() {}
open fun onSwipeTop() {}
open fun onSwipeBottom() {}
open fun onSwipeDown() {
}
}
滑动功能或任何类型的触控侦听器都无法工作。为什么会这样?我是Kotlin和移动应用开发的新手。因此,任何帮助都是非常感谢的。在Android中,手势被定义为动作开始时向下,以动作结束时向上。如果你想让你的视图收到一个手势,你必须返回true,否则你将一无所获 根本原因
override fun onDown(e: MotionEvent): Boolean {
return false
}
因为在此回调中,您返回false,这意味着您的视图对任何手势都不感兴趣,这解释了为什么不调用所有回调,例如onFling()、onsweepright()、onsweeleft()
解决方案
对于“操作\停止”事件返回true
override fun onDown(e: MotionEvent): Boolean {
return true
}
这是一篇关于Android触摸系统的好文章。有时间请看一看