文章转载自: 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); 

}

更多相关文章

  1. Android的ListView控件滚动时背景问题
  2. Android(安卓)滚动条
  3. Android(安卓)实现ListView 3D效果 - 2 - 弹性滚动,Fling
  4. 两个界面的切换
  5. ScrollView嵌套webview因焦点问题导致自动滑动
  6. textview scroll
  7. ScrollView嵌套RecyclerView冲突解决
  8. Android(安卓)Design Support Library——Google I/O 2015 为 An
  9. 为Android应用程序添加两个入口

随机推荐

  1. Android(安卓)Add-ons
  2. 分享偶的android秘籍
  3. Android横竖屏切换总结
  4. Android(安卓)Studio Gradle 添加.so 支
  5. Android:ANT打包常见问题简述
  6. Android程序开发初级教程(一) 开始 Hello
  7. 如何启动Android(安卓)SDK 1.5模拟器
  8. Android软键盘显示模式及打开和关闭方式
  9. Android下玩JNI的新老三种姿势
  10. Android单元测试