我有从顶部设置动画的叠加视图。在那个场景中,我有带元素列表的回收视图。
当用户将列表滚动到最后时,进一步滚动应该向上滚动整个回收站视图(在下面显示视图),并在ACTION_UP
上滚动回收器到屏幕外。
覆盖onTouch事件并不起作用:
这就像新的Tinder卷轴揭示了反应(2017-11-17)
任何想法怎么做?
答案 0 :(得分:1)
试试这个:
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
在onScrolled方法中,您可以翻译整个recyclerView。
要检查您是否已达到目的,请在onScrolled方法中使用此方法
recyclerView.canScrollVertically(1);
这将返回一个布尔值。然后,您可以检查并移动视图。 希望这会有所帮助。
答案 1 :(得分:0)
好的,我自己解决了。当我谈到故障时onTouch
我犯了一个错误。我将翻译设置为RecyclerView
,但我使用了MotionEvent.getX()
代替MotionEvent.getRawX()
,由于getX()
另外
Sarthak Gandhi的帮助。recyclerView.canScrollVertically(1);
override fun onTouch(p0: View?, p1: MotionEvent): Boolean {
if (p1.action == MotionEvent.ACTION_UP && dragging) {
dragging = false
mInitailPoint = null
currentDy.invoke(0F)
return true
}
if (p1.action == MotionEvent.ACTION_DOWN || p1.action == MotionEvent.ACTION_MOVE) {
if (!dragging && !recyclerView.canScrollVertically(1)) {
mInitailPoint = Point(p1.rawX.toInt(), p1.rawY.toInt())
mCurrentPoint = Point(p1.rawX.toInt(), p1.rawY.toInt())
dragging = true
return true
} else if (dragging && p1.action == MotionEvent.ACTION_MOVE) {
mCurrentPoint = Point(p1.rawX.toInt(), p1.rawY.toInt())
val dy = mCurrentPoint!!.y.toFloat() - mInitailPoint!!.y.toFloat()
if (dy < 0) {
currentDy.invoke(dy)
} else {
currentDy.invoke(0F)
dragging = false
return false
}
return true
}
}
return false
}
此时currentDy.invoke(dy)
实际上将翻译设置为RecyclerView
当然这不是完整的代码来实现更好的东西而且没有动画动画,但这部分是关于这个问题的。
故事的道德:如果您为要翻译的视图设置OnTouchListener
,请使用原始坐标来计算翻译