先看效果(由于視頻轉(zhuǎn)Gif壓縮所以視圖邊界被切掉了 不是布局問題):
思路
右邊列表滑動到最頂最低不時進(jìn)行刷新界面同時或杠,界面有個切換的效果以清,以及右邊的listView進(jìn)行狀態(tài)變化(注意當(dāng)索引小于0或者大于列表的最大值是不能在切換列表狀態(tài)及視圖刷新)
首先對事件處理:
1.當(dāng)右邊列表未滑倒最頂最低時不能消費(fèi)此事件
2.當(dāng)滑動距離小于一個臨界值時不能切換下一個或者上一個列表。
3.當(dāng)滑動到最頂最低時在反方向回滑時做好是否刷新列表判斷阱佛。
此處做了個偷懶沒對其他控件做適配台丛。
// 能否上滑
private boolean canSrcollUp() {
if (childView instanceof RecyclerView) {
// recyclerView.canScrollVertically(1)的值表示是否能向上滾動耍缴,false表示已經(jīng)滾動到底部
RecyclerView recyclerView = (RecyclerView) childView;
return !recyclerView.canScrollVertically(1);
}
return false;
}
// 能否下滑
private boolean canSrcollDown() {
if (childView instanceof RecyclerView) {
RecyclerView recyclerView = (RecyclerView) childView;
return !recyclerView.canScrollVertically(-1);
}
// invalidate();
return false;
}
視圖滑動效果通過 View.srcollTo(0 ,moveY); 實(shí)現(xiàn)
@Override
public boolean onTouchEvent(MotionEvent event) {
if (childHeigth <1) {
childHeigth = childView.getHeight();
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
dragY = event.getY() - downY;
// 判斷上下滑動
if (dragY < 0 && canSrcollUp()) {
canSrcollUp = true;
scrollTo(0 , -(int)dragY);
}else if (dragY > 0 && canSrcollDown()){
canSrcollDown = true;
scrollTo(0 , -(int)dragY);
}
break;
case MotionEvent.ACTION_UP:
canSrcollDown = dragY > 0;
canSrcollUp = dragY < 0;
dragY = Math.abs(dragY);
// 上滑操作
if (minMoveY < dragY && canSrcollUp) {
currentIndex += 1;
goneChildView(false);
scrollTo(0 ,childHeigth);
handler.sendEmptyMessageDelayed(VISIBLE_UP_VIEW ,500);
}else if (minMoveY < dragY && canSrcollDown){ // 下滑操作
currentIndex -= 1;
goneChildView(true);
scrollTo(0 ,-childHeigth);
handler.sendEmptyMessageDelayed(VISIBLE_DOWN_VIEW ,500);
}else {
scrollTo(0 , 0);
}
break;
default:
break;
}
return true;
}
下面就是對事件攔截做判斷了
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercept = false;
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
intercept = false;
downY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
dragY = ev.getY() - downY;
// 滑動攔截
if (dragY < 0 && canSrcollUp() && currentIndex < maxIndex) {
intercept = true;
}else if (dragY > 0 && canSrcollDown() && currentIndex > 0) {
intercept = true;
}
break;
case MotionEvent.ACTION_UP:
intercept = false;
break;
}
return intercept;
}
這樣效果就有了