ScrollView嵌套ScrollView

来源:互联网 发布:广州恒大淘宝队 编辑:程序博客网 时间:2024/05/16 04:51

From:http://www.eoeandroid.com/thread-240709-1-1.html

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

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

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

效果截图:


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

view source
001packagecom.sun.shine.study.innerscrollview.view;
002 
003importandroid.content.Context;
004importandroid.util.AttributeSet;
005importandroid.view.MotionEvent;
006importandroid.view.View;
007importandroid.widget.ScrollView;
008 
009publicclass InnerScrollView extendsScrollView {
010 
011   /**
012     */
013   publicScrollView parentScrollView;
014 
015   publicInnerScrollView(Context context, AttributeSet attrs) {
016        super(context, attrs);
017 
018   }
019 
020   privateint lastScrollDelta = 0;
021 
022   publicvoid resume() {
023        overScrollBy(0, -lastScrollDelta, 0, getScrollY(), 0, getScrollRange(), 0,0,true);
024        lastScrollDelta = 0;
025   }
026 
027   intmTop = 10;
028 
029   /**
030     * 将targetView滚到最顶端
031     */
032   publicvoid scrollTo(View targetView) {
033 
034        intoldScrollY = getScrollY();
035        inttop = targetView.getTop() - mTop;
036        intdelatY = top - oldScrollY;
037        lastScrollDelta = delatY;
038        overScrollBy(0, delatY, 0, getScrollY(), 0, getScrollRange(), 0,0,true);
039   }
040 
041   privateint getScrollRange() {
042        intscrollRange = 0;
043        if(getChildCount() > 0) {
044            View child = getChildAt(0);
045            scrollRange = Math.max(0, child.getHeight() - (getHeight()));
046        }
047        returnscrollRange;
048   }
049 
050   intcurrentY;
051 
052   @Override
053   publicboolean onInterceptTouchEvent(MotionEvent ev) {
054        if(parentScrollView == null) {
055            returnsuper.onInterceptTouchEvent(ev);
056        }else{
057            if(ev.getAction() == MotionEvent.ACTION_DOWN) {
058                // 将父scrollview的滚动事件拦截
059                currentY = (int)ev.getY();
060                setParentScrollAble(false);
061                returnsuper.onInterceptTouchEvent(ev);
062            }elseif (ev.getAction() == MotionEvent.ACTION_UP) {
063                // 把滚动事件恢复给父Scrollview
064                setParentScrollAble(true);
065            }elseif (ev.getAction() == MotionEvent.ACTION_MOVE) {
066            }
067        }
068        returnsuper.onInterceptTouchEvent(ev);
069 
070   }
071 
072   @Override
073   publicboolean onTouchEvent(MotionEvent ev) {
074        View child = getChildAt(0);
075        if(parentScrollView != null) {
076            if(ev.getAction() == MotionEvent.ACTION_MOVE) {
077                intheight = child.getMeasuredHeight();
078                height = height - getMeasuredHeight();
079 
080                // System.out.println("height=" + height);
081                intscrollY = getScrollY();
082                // System.out.println("scrollY" + scrollY);
083                inty = (int)ev.getY();
084 
085                // 手指向下滑动
086                if(currentY < y) {
087                    if(scrollY <= 0) {
088                        // 如果向下滑动到头,就把滚动交给父Scrollview
089                        setParentScrollAble(true);
090                        returnfalse;
091                    }else{
092                        setParentScrollAble(false);
093 
094                    }
095                }elseif (currentY > y) {
096                    if(scrollY >= height) {
097                        // 如果向上滑动到头,就把滚动交给父Scrollview
098                        setParentScrollAble(true);
099                        returnfalse;
100                    }else{
101                        setParentScrollAble(false);
102 
103                    }
104 
105                }
106                currentY = y;
107            }
108        }
109 
110        returnsuper.onTouchEvent(ev);
111   }
112 
113   /**
114     * 是否把滚动事件交给父scrollview
115     *
116     * @param flag
117     */
118   privatevoid setParentScrollAble(booleanflag) {
119 
120        parentScrollView.requestDisallowInterceptTouchEvent(!flag);
121   }
122 
123}

 

0 0
原创粉丝点击