ScrollView如何嵌套ScrollView

来源:互联网 发布:机器人软件开发平台 编辑:程序博客网 时间:2024/05/29 17:00

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;@Overridepublic 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);}@Overridepublic 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

0 0