需求
这几天在用android做网易云的歌单效果,大致需求是一个全屏的activity,上面是一个LinearLayout,下面是RecyclerView,然后滑动RecylerView整体移动LinearLayout和RecylerView,当LinearLayout移动到顶端的时候不再继续移动,而是滚动RecylerView
误区
第一想法在RecylerView上添加onTouchEventListener,但是这样就会有一个问题,当在RecylerView的item上添加事件时,RecylerView将无法捕获到TouchDown
解决方案
出现这种状况的原因主要是子控件的事件处理消费掉了这个事件,不让其继续传播
在网上搜寻过各种方法,如在item的根布局上添加android:descendantFocusability="blocksDescendants",设置点击控件的cclickable和focusable为true,都无法解决,最后的解决方案是不用根布局的onTouchEventListener,改用addOnItemTouchListener,addOnItemTouchListener可以在点击item的时候拦截掉这个点击事件。
代码展示
songList.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
private int startY;
@Override
public boolean onInterceptTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int moveY = (int) event.getRawY();
//拿到手指移动距离的大小
int move_bigY = moveY - startY;
//拿到当前控件未移动的坐标
int top = contentMain.getTop();
top += move_bigY;
if (top > 0 || top < limitTop) {
return false;
}
contentMain.layout(contentMain.getLeft(), top, contentMain.getRight(), contentMain.getBottom());
startY = moveY;
break;
}
return false;
}