码迷,mamicode.com
首页 > 其他好文 > 详细

ScrollView如何嵌套ScrollView

时间:2016-05-12 14:03:46      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:

android开发中ScrollView嵌套ScrollView是android最常用的功能,众所周知,android 里两个相同方向的ScrollView是不能嵌套的,那要是有这样的需求怎么办?

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


package com.example.easy.view;

/**
* Created by admin on 2016/5/10.
*/
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);

}

}
dit

ScrollView如何嵌套ScrollView

标签:

原文地址:http://blog.csdn.net/care_about/article/details/51362167

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!