先看效果(由于视频转Gif压缩所以视图边界被切掉了 不是布局问题):
思路
右边列表滑动到最顶最低不时进行刷新界面同时,界面有个切换的效果,以及右边的listView进行状态变化(注意当索引小于0或者大于列表的最大值是不能在切换列表状态及视图刷新)
首先对事件处理:
1.当右边列表未滑倒最顶最低时不能消费此事件
2.当滑动距离小于一个临界值时不能切换下一个或者上一个列表。
3.当滑动到最顶最低时在反方向回滑时做好是否刷新列表判断。
此处做了个偷懒没对其他控件做适配。
// 能否上滑
private boolean canSrcollUp() {
if (childView instanceof RecyclerView) {
// recyclerView.canScrollVertically(1)的值表示是否能向上滚动,false表示已经滚动到底部
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); 实现
@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;
}
这样效果就有了