這幾天在用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;
}
複製代碼