android之ScrollView里嵌套ScrollView(轉)


大家好,眾所周知,android 里兩個相同方向的ScrollView是不能嵌套的,那要是有這樣的需求怎么辦?(這個需求一般都是不懂android的人提出來的)
難道就真的不能嵌套嗎? 當然可以,只要你再寫一個ScrollView,在里面做點腳,它就支持嵌套了。
目前做的這個只支持兩個ScrollView嵌套,兩個以上還有待改進,能套兩個就已經能滿足很多需求了,呵呵,另外現在只做了縱向scrollview的支持,橫向的還沒來的急做哦。
效果截圖: <ignore_js_op>騰訊手機管家動態截屏2012122001.gif


先上核心代碼吧。代碼里頭我加了注釋,方便大家閱讀

 

 

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 ScrollView parentScrollView;
 
    public InnerScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
 
    }
 
    private int lastScrollDelta = 0;
 
    public void resume() {
        overScrollBy(0, -lastScrollDelta, 0, getScrollY(), 0, getScrollRange(), 0, 0, true);
        lastScrollDelta = 0;
    }
 
    int mTop = 10;
 
    /**
     * 將targetView滾到最頂端
     */
    public void scrollTo(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 int getScrollRange() {
        int scrollRange = 0;
        if (getChildCount() > 0) {
            View child = getChildAt(0);
            scrollRange = Math.max(0, child.getHeight() - (getHeight()));
        }
        return scrollRange;
    }
 
    int currentY;
 
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (parentScrollView == null) {
            return super.onInterceptTouchEvent(ev);
        } else {
            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                // 將父scrollview的滾動事件攔截
                currentY = (int)ev.getY();
                setParentScrollAble(false);
                return super.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 boolean onTouchEvent(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);
                        return false;
                    } else {
                        setParentScrollAble(false);
 
                    }
                } else if (currentY > y) {
                    if (scrollY >= height) {
                        // 如果向上滑動到頭,就把滾動交給父Scrollview
                        setParentScrollAble(true);
                        return false;
                    } else {
                        setParentScrollAble(false);
 
                    }
 
                }
                currentY = y;
            }
        }
 
        return super.onTouchEvent(ev);
    }
 
    /**
     * 是否把滾動事件交給父scrollview
     * 
     * @param flag
     */
    private void setParentScrollAble(boolean flag) {
 
        parentScrollView.requestDisallowInterceptTouchEvent(!flag);
    }
 
}

 

轉載於:http://www.eoeandroid.com/thread-240709-1-1.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM