ScrollView如何嵌套ScrollView

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

时间: 2024-10-11 20:37:25

ScrollView如何嵌套ScrollView的相关文章

ScrollView中嵌套ScrollView或ListView并且内部ScrollView或ListView也可滑动

1.ScrollView中嵌套ScrollView并且内部ScrollView也可滑动 (1)ScrollView继承类 public class InnerScrollView extends ScrollView { Handler handler; public ScrollView parentScrollView; public InnerScrollView(Context context, AttributeSet attrs) { super(context, attrs); h

ScrollView下嵌套GridView或ListView默认不在顶部的解决方法

当ScrollView下嵌套GridView或ListView时,如果内容超过一屏默认位置不在ScrollView的顶部,用scrollViewMsg.scrollTo(0,0)设置也不起作用,这是因为嵌套GridView或ListView获了焦点,解决方法有如下几种: 方法1把ScrollView里的第一个View获取焦点: baseView.setFocusable(true); baseView.setFocusableInTouchMode(true); baseView.request

Android仿小米商城商品详情界面UI,ScrollView嵌套ScrollView/WebView/ListView

最近公司没事,研究了下多嵌套滚动组件的事件分发,虽然以前也接触过,但都是拿网上的用,也是特别简单的,正好朋友也需要,就研究了下 这个Demo也不是很完善,放上来也是让各位大牛给指点一下,优化优化 使用情景: 小米商城商品详情界面,界面看似ScrollView,但当正常滚动到底部时,提示继续上拉显示更多详情,上拉后直接滚动到第二屏,第二屏是个ViewPager,ViewPager里面的各个pager有的是WebView有的是ListView,有的是ScrollView,一开始想想就特别头晕,后来理

解决scrollView中嵌套编辑框导致不能上下滑动的问题

EditText设置maxLines之后,文本行数超过maxLines,会网上折叠,上下滑动可以浏览所有文本. 若EditText外层有scrollView,在EditText上下滑动,不会像正常情况那样上,只会滑动了scrollView. 解决办法是: mEt_content.setOnTouchListener(this); // 解决scrollView中嵌套EditText导致不能上下滑动的问题 @Override public boolean onTouch(View v, Motio

解决小米系统下ViewPager、ScrollView内嵌套WebView时,Touch事件不响应的问题

前言:一直拿原生android4.4的Nexus5测试,结果装到老大的小米上,出了bug.安卓的兼容性问题真是....难以形容. Bug详细描述:本人用webview运行JS Goole地图,单独使用该webview时一切正常,而当放在scrollview和viewpager下,小米手机上便无法移动地图,其他手机是没问题的. 解决方案: 一.ScrollView内嵌套WebView 作为一个新手,我简单的检查了viewpager和scrollview的三个函数(dispatchTouchEven

笔记整理1_1:解决在ScrollView中嵌套ListView不能显示全部item的问题

package com.example.scrollview; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import com.pb.custo

ListView嵌套ScrollView后,设置dividerHeight属性后高度计算

当我们需要在listView外层嵌套ScrollView,这样两个scroll滚动效果会产生相互影响,为了避免这个,我们通常是禁止listView滚动, 把ListView总高度计算出来,完全显示. 计算listView的总高度只需要自定义一个mylistView继承listView,重写onMeasure(...)方法就搞定了. @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { i

ScrollView中嵌套GridView,Listview的办法

按照android的标准,ScrollView中是不能嵌套具有滑动特性的View的,但是有时如果设计真的有这样做的需要,或者为了更方便简单的实现外观(比如在外在的大布局需要有滑动的特性,并且内部有类似于List的UI结构,那么ListView + Adpater的方式来实现里面的效果就很方便,算是违规抄近道的一种方式吧),有时就会不得不采用这种怪异的组合方式. 先说下这种方式如果不做特殊处理时会出现的冲突和问题: 1,在SrollView中嵌套ListView,ListView的显示会有问题,只

ScrollView中嵌套ListView时,listview高度显示的问题

方法一:直接更改listview的控件高度,动态获取(根据条目和每个条目的高度获取) 前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListView会显示不完全,它的高度始终有问题.上网查了下,发现别人也有遇到这样的问题,而大多数人都不推荐这样的设计,因为默认情况下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是无法计