这几天在用android作网易云的歌单效果,大体需求是一个全屏的activity,上面是一个LinearLayout,下面是RecyclerView,而后滑动RecylerView总体移动LinearLayout和RecylerView,当LinearLayout移动到顶端的时候再也不继续移动,而是滚动RecylerViewjava
第一想法在RecylerView上添加onTouchEventListener,可是这样就会有一个问题,当在RecylerView的item上添加事件时,RecylerView将没法捕获到TouchDownandroid
出现这种情况的缘由主要是子控件的事件处理消费掉了这个事件,不让其继续传播ide
在网上搜寻过各类方法,如在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;
}
复制代码