在android中ScrollView嵌套ScrollV…

来源:互联网 发布:乐谱制作软件 编辑:程序博客网 时间:2024/05/23 14:29

大家好,众所周知,android里两个相同方向的ScrollView是不能嵌套的,那要是有这样的需求怎么办?(这个需求一般都是不懂android的人提出来的)

难道就真的不能嵌套吗? 当然可以,只要你再写一个ScrollView,在里面做点脚,它就支持嵌套了。

目前做的这个只支持两个ScrollView嵌套,两个以上还有待改进,能套两个就已经能满足很多需求了,呵呵,另外现在只做了纵向scrollview的支持,横向的还没来的急做哦。

效果截图:

先上核心代码吧。代码里头我加了注释,方便大家阅读

package com.sun.shine.study.innerscrollview.view;
 
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ScrollView;
 
public class InnerScrollView extends ScrollView {
 
   
    public ScrollViewparentScrollView;
 
    publicInnerScrollView(Context context, AttributeSet attrs) {
       super(context, attrs);
 
    }
 
    private intlastScrollDelta = 0;
 
    public void resume(){
       overScrollBy(0, -lastScrollDelta, 0,getScrollY(), 0, getScrollRange(), 0, 0, true);
       lastScrollDelta = 0;
    }
 
    int mTop = 10;
 
   
    public voidscrollTo(View targetView) {
 
       int oldScrollY = getScrollY();
       int top = targetView.getTop() - mTop;
       int delatY = top - oldScrollY;
       lastScrollDelta = delatY;
       overScrollBy(0, delatY, 0, getScrollY(), 0,getScrollRange(), 0, 0, true);
    }
 
    private intgetScrollRange() {
       int scrollRange = 0;
       if (getChildCount() > 0) {
           View child= getChildAt(0);
          scrollRange = Math.max(0, child.getHeight() - (getHeight()));
       }
       return scrollRange;
    }
 
    int currentY;
 
    @Override
    public booleanonInterceptTouchEvent(MotionEvent ev) {
       if (parentScrollView == null) {
           returnsuper.onInterceptTouchEvent(ev);
       } else {
           if(ev.getAction() == MotionEvent.ACTION_DOWN) {
              // 将父scrollview的滚动事件拦截
              currentY =(int)ev.getY();
             setParentScrollAble(false);
              returnsuper.onInterceptTouchEvent(ev);
           } else if(ev.getAction() == MotionEvent.ACTION_UP) {
              // 把滚动事件恢复给父Scrollview
             setParentScrollAble(true);
           } else if(ev.getAction() == MotionEvent.ACTION_MOVE) {
           }
       }
       return super.onInterceptTouchEvent(ev);
 
    }
 
    @Override
    public booleanonTouchEvent(MotionEvent ev) {
       View child = getChildAt(0);
       if (parentScrollView != null) {
           if(ev.getAction() == MotionEvent.ACTION_MOVE) {
              int height =child.getMeasuredHeight();
              height = height -getMeasuredHeight();
 
              //System.out.println("height=" + height);
              int scrollY =getScrollY();
              //System.out.println("scrollY" + scrollY);
              int y = (int)ev.getY();
 
              // 手指向下滑动
              if (currentY < y) {
                 if (scrollY <= 0) {
                     //如果向下滑动到头,就把滚动交给父Scrollview
                    setParentScrollAble(true);
                     returnfalse;
                 } else {
                    setParentScrollAble(false);
 
                 }
              } else if (currentY > y){
                 if (scrollY >= height) {
                     //如果向上滑动到头,就把滚动交给父Scrollview
                    setParentScrollAble(true);
                     returnfalse;
                 } else {
                    setParentScrollAble(false);
 
                 }
 
              }
              currentY = y;
           }
       }
 
       return super.onTouchEvent(ev);
    }
 
   
    private voidsetParentScrollAble(boolean flag) {
 
      parentScrollView.requestDisallowInterceptTouchEvent(!flag);
    }
 
}
原创粉丝点击