文章转载自:http://www.jb51.net/article/33054.htm
大家好,众所周知,android里两个相同方向的ScrollView是不能嵌套的,那要是有这样的需求怎么办,接下来为您介绍解决方法,感兴趣的朋友可以了解下
大家好,众所周知,android里两个相同方向的ScrollView是不能嵌套的,那要是有这样的需求怎么办?(这个需求一般都是不懂android的人提出来的)

难道就真的不能嵌套吗?当然可以,只要你再写一个ScrollView,在里面做点脚,它就支持嵌套了。 
目前做的这个只支持两个ScrollView嵌套,两个以上还有待改进,能套两个就已经能满足很多需求了,呵呵,另外现在只做了纵向scrollview的支持,横向的还没来的急做哦。 
效果截图: 
 
先上核心代码吧。代码里头我加了注释,方便大家阅读

复制代码代码如下:

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); 

在android中ScrollView嵌套ScrollView解决方案相关推荐

  1. Android透明到白色滑动渐变,Android中Toolbar随着ScrollView滑动透明度渐变效果实现...

    Android中Toolbar随着ScrollView滑动透明度渐变效果实现 一.思路:监听ScrollView的滑动事件 不断的修改Toolbar的透明度 二.注意 1.ScrollView 6.0 ...

  2. Android ScrollView嵌套ScrollView滚动的问题解决办法

    引用:http://mengsina.iteye.com/blog/1707464 http://fenglog.com/article.asp?id=449 Android ScrollView嵌套 ...

  3. Android中RecyclerView嵌套RecyclerView或嵌套ListView

    Android中RecyclerView嵌套RecyclerView或嵌套ListView

  4. [Android实例] [版主原创]ScrollView嵌套ScrollView

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

  5. Android中监听ScrollView滑动停止和滑动到底部

    1.监听ScrollView滑动停止: [java] view plaincopy /********************监听ScrollView滑动停止********************* ...

  6. ScrollView嵌套ScrollView

    原博客地址: http://www.eoeandroid.com/thread-240709-1-1.html 大家好,众所周知,android 里两个相同方向的ScrollView是不能嵌套的,那要 ...

  7. android 中RecyclerView 嵌套了 GridView 的用法

    提醒一下 RecyclerView 安卓自带的当中是没有的,所以需要导入包的. android.support.v4.widget.SwipeRefreshLayout 中的v7,v4都已经变成 an ...

  8. Android中ScrollView嵌套WebView

    2019独角兽企业重金招聘Python工程师标准>>> Android中WebView用来加载html页面,自带滑动效果.ScrollView同样也是自带滑动效果,在项目中如果需要W ...

  9. android中ScrollView嵌套ListView或GridView显示位置问题

    Android中ScrollView中嵌套ListView或GridView时在开始进入界面时总是显示中间位置,开头的位置显示不出来.这种情况下只需要在ScrollView的父控件中添加以下两行代码即 ...

最新文章

  1. 用C++写一个没人用的ECS
  2. Native与H5交互的那些事
  3. HashMap 源码解析(JDK1.8)
  4. 《磨难之间》——刻意设计,缺失核心
  5. Ubuntu 更改ROOT密码的方法
  6. 【Java】带你走进Debug的世界
  7. 成都python工作少_成的解释|成的意思|汉典“成”字的基本解释
  8. 旷视孙剑团队提出AutoML神经架构搜索新方法:单路径One-Shot,更精确更省时
  9. python画科赫雪花
  10. 小米8android版本打开,怎么查看小米手机安卓系统版本
  11. 如何自己开发漏洞扫描工具
  12. OpenPDF 或 itext5 根据pdf模板生成多页PDF
  13. rtc校准算法_CRC校验算法的实例解析
  14. Zemax单透镜设计
  15. 捷讯fw300r虚拟服务器口号,迅捷FW300R开启UPnP功能
  16. 沧海拾珠(持续更新。。。)
  17. 计算机组成原理 — PCI-E 外设接口标准
  18. win7已经阻止此发行者在您的计算机上运行软件,win7系统打开特定网站提示“控件无法安装,windows已阻止此软件因为无法验证发行者”如何解决...
  19. 怎么调整计算机显示屏,电脑显示器画面怎么调整
  20. 如何将喜马拉雅FM的音频下载下来保存

热门文章

  1. JDK源码解析之java.util.Iterator和java.lang.Iterable
  2. Angular Material 阴影使用
  3. Ubuntu中安装python3
  4. 搞懂toString()与valueOf()的区别
  5. 迟到的年度总结,我们应该收放自如
  6. Python运行环境与异常处理
  7. Gram matrix 格拉姆矩阵
  8. JavaOne大事纪:IBM谈OpenJ9和Open Liberty
  9. CentOS 创建SVN 服务器,并且自动同步到WEB 目录
  10. 如何实现:判断数据库中某表是否有记录,若为空,则插入一条记录。若不为空则查询某记录...