1.需要实现的效果
在网上找了很久没有好的可以借用的,就想着自己动手写个吧!
主要实现逻辑:
首先测量出悬浮窗上面布局的高度,然后判断scrollview是否滑动到了这个高度,如果已经到了就把最大的高度设置成布局的高度,看代码:
@Override protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { CrollY = scrollY; //判断如果滑动的距离大于view的高度就直接设置成view的高度 if (scrollY >= mViewHeight){ scrollY =mViewHeight; isRun = false; } super.onOverScrolled(scrollX, scrollY, clampedX, clampedY); }
然后再跟进滑动的距离进行拦截事件,根据滑动距离判断是上滑还是下拉,看代码:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: dowmX = ev.getX(); dowmY = ev.getY(); mViewHeight = mView.getHeight(); scrollY = dowmY; break; case MotionEvent.ACTION_MOVE: float X = ev.getX(); float Y = ev.getY(); float xx = X - dowmX; float yy = Y - dowmY; Log.i("TAG","Y----->"+Y); Log.i("TAG","-----》getScorll : "+getScrollY()); if (Math.abs(yy)>Math.abs(xx)&& isScroll){ // return true;//scrollview执行滑动 Listview不滑动 // return false;//listView滑动 scrollview不滑动 if (!isRun && isTop){ return false; } else if (!isRun && !isTop){ if (scrollY < Y && (Y - scrollY) > SCROLLLIMIT){ //往下拉 isTop = false; isRun = true; return true; }else { if (getScrollY() == mViewHeight){ return false; } } } } break; case MotionEvent.ACTION_UP: break; } return super.onInterceptTouchEvent(ev); }
然后再使用的时候需要设置下:
scrollView.setView(lin_view); //设置高度为屏幕的高度 ViewGroup.LayoutParams params = plvService.getLayoutParams(); params.height = height; plvService.setLayoutParams(params); plvService.requestLayout(); lv_content_view.setLayoutParams(params); lv_content_view.requestLayout(); scrollView.isScroll(true);注意:设置子view的高度非常重要,不然无法实现滑动效果
最后的效果:
源码下载地址:源码地址