1

我目前正在开发一个小型 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/参考/android/support/v7/widget/helper/ItemTouchHelper.Callback.html来完成拖放功能。我的方法是使用这些助手提供的拖放检测(看看https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aaf#.ib8r012gc) 修改它以避免移动一个项目并且只检测我想要的触摸+拖放手势。我已经通过删除默认拖动动画(覆盖 ItemTouchHelper onDraw/onDrawOver)并使用 ItemTouchHelper.Callback 回调来管理拖动运动(不交换适配器项目,因为我需要它们始终在同一位置)正确地完成了该功能。一切正常,但我现在面临一个问题,因为拖动检测没有按预期工作。我将尝试解释一下:如果我在给定单元格的中心开始拖动移动,然后移动到其左侧的单元格,则在到达中心之前不会触发拖动移动(与我开始拖动移动的位置相同)左侧单元格。这是一个问题,因为我需要在到达另一个单元格时立即检测到拖动(如果手指在新的单元格边界内,则应该触发拖动)。另一个例子是:如果我在一个单元格的最左侧开始拖动移动,直到我到达另一个单元格的最左侧时才会触发拖动。

现在,我正在尝试使用 ItemTouchHelper.Callback.chooseDropTarget 方法来在手指进入新单元格后立即手动选择放置目标,但我无法让它工作。我认为(但我无法确保)接收到的 x,y 坐标有些奇怪。

我知道一些代码示例会很有帮助,但我无法粘贴它,因为它属于私有且受保护的存储库:(

任何人都可以提供给我的任何帮助将不胜感激。而且,当然,我会尽量保留这个话题,以提供我能提供的所有信息。我还将考虑新的不同方法和建议来获得我需要移动范围边界的“触摸+移动+向上”运动:)

非常感谢所有 Stack Overflow 社区!

4

1 回答 1

1

经过更多研究,我找到了解决问题的方法。我会发布它,所以如果有人遇到同样的问题,他可以在这里找到一些帮助:)

我的问题是我使用curXcurYItemTouchHelper.Callback.chooseDropTargethttps://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) ) 好像它们是拖动时的当前手指坐标,但它们是应用任何平移后拖动视图的最左上角坐标。现在我觉得有点傻。我应该更好地阅读文档:|

由于我不需要最左上角的坐标而是手指位置,我的解决方案是使用附加到源视图的触摸侦听器,这样我就可以使用touchSrcX = MotionEvent.getX()andtouchSrcY = MotionEvent.getY()方法检测初始触摸 x,y 坐标(相对于该视图)和然后我在chooseDropTarget回调中选择目标之前应用了点平移。我的意思是,类似: curX += touchSrcX curY += touchSrcY

如果有人需要更多详细信息或更好的解释,请与我联系,我很乐意为您提供帮助!:)

于 2016-10-20T06:33:53.700 回答