我目前正在开发一个小型Android模块,而我正面临一个可能有人可以解决的问题。我需要创建日历并允许用户选择日期范围1)单击开始日期(默认情况下将创建2天范围)然后2)触摸一个范围边框并拖动它以增加或减少该范围。
目前,我已使用带有GridLayoutManager的 RecyclerView 创建了所有日历天数单元格,其中包含很多行(所有周),每行7个项目(天)。然后我使用了RecyclerView ItemTouchHelper (https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.html)和ItemTouchHelper.Callback (https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.Callback.html)来完成拖动&删除功能。我的方法是使用那些帮助者提供的拖放检测(看看https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aaf#.ib8r012gc)修改它以避免移动一个项目并且仅检测我想要的触摸+拖放操作。通过删除默认拖动动画(覆盖ItemTouchHelper onDraw / onDrawOver)并使用ItemTouchHelper.Callback回调来管理拖动动作(没有交换适配器项目,因为我需要它们始终位于相同位置),我已正确完成了该功能)。一切正常但我现在面临一个问题,因为拖动检测没有按预期工作。我将尝试解释它:如果我在给定单元格的中心开始拖动运动,并且我向左移动单元格,则不会触发拖动运动,直到我&#39已经到达了左侧单元格的中心(我开始拖动运动的位置)。这是一个问题,因为我需要在到达另一个单元格时检测到拖动(如果手指在新单元格边界内,则应该触发拖动)。另一个例子是:如果我在单元格的最左侧开始拖动运动,则不会触发拖动,直到我到达另一个单元格的最左侧。
现在我尝试使用ItemTouchHelper.Callback.chooseDropTarget方法尝试一下手指进入新单元格后立即手动选择放置目标但是我是无法使其发挥作用。我认为(但我无法确定)接收到的x,y坐标是奇怪的。
我知道一些代码示例会非常有用但我无法粘贴它,因为它属于一个私有且受保护的存储库:(
任何人都可以提供的帮助将非常感谢。当然,我会尝试等待本主题提供我能提供的所有信息。我还会考虑新的不同方法和建议,以便“触摸+移动+上升”#34;移动我需要移动范围边界:)
非常感谢所有Stack Overflow社区!
答案 0 :(得分:1)
经过一些研究,我找到了解决问题的方法。我会发布它,所以如果有人面临同样的问题,他可以在这里找到一些帮助:)
我的问题是我使用curX
(https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.Callback.html#chooseDropTarget(android.support.v7.widget.RecyclerView.ViewHolder,%20java.util.List%3Candroid.support.v7.widget.RecyclerView.ViewHolder%3E,%20int,%20int))返回的curY
和ItemTouchHelper.Callback.chooseDropTarget
参数,好像它们是拖动时的当前手指坐标,但是是应用任何平移后拖动视图的最左上角坐标的坐标。现在我觉得有点愚蠢。我应该更好地阅读文档:|
由于我不需要最左上角坐标而是手指位置,我的解决方案是使用附加到源视图的触摸侦听器,这样我就可以使用以下方法检测初始触摸x,y坐标(相对于该视图) touchSrcX = MotionEvent.getX()
和touchSrcY = MotionEvent.getY()
方法然后我在chooseDropTarget
回调中选择目标之前应用了点转换。我的意思是,像:
curX += touchSrcX
curY += touchSrcY
如果有人需要更多细节或更好的解释,请联系我,我很乐意为您提供帮助! :)