专业网站策划公司,使用WordPress快速建站视频,天津建设工程信息网公布,简答电子商务网站建设流程文章转载自#xff1a;http://www.jb51.net/article/33054.htm大家好#xff0c;众所周知#xff0c;android里两个相同方向的ScrollView是不能嵌套的#xff0c;那要是有这样的需求怎么办,接下来为您介绍解决方法#xff0c;感兴趣的朋友可以了解下大家好#xff0c;众所…文章转载自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); } }