在android中ScrollView嵌套ScrollView解决方案

2016-02-19 10:57 115 1 收藏

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的在android中ScrollView嵌套ScrollView解决方案,手机电脑控们准备好了吗?一起看过来吧!

【 tulaoshi.com - 编程语言 】

大家好,众所周知,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);
}
}

来源:https://www.tulaoshi.com/n/20160219/1596203.html

延伸阅读
随着中小企业在我国的蓬勃发展,越来越多的网络服务器会逐步进入千千万万的中小企业,与此同时,很多大的企业、机构随着业务的扩充分支机构也不断增加,这些用户需要购置网络服务器来满足业务发展的需要。但是这些用户受企业状况、资金预算的限制往往无法购置价格昂贵的基于SCSI接口的网络服务器,他们通常会选择性能较差、无冗余支持的ID...
标签: Web开发
一、使用iframe,通过document.write产生历史 代码如下: !DOCTYPE html html head meta charset="utf-8"/ title0/title /head body input type="button" value="加1" onclick="add()" / div id="info" style="border:red 1px solid;width:200px;padding:10px;margin:5px;"0/div /body /html script src="history-0.1.js"/script ...
标签: ASP
  使用到的技术:   ASP,WSH,VBScript   文件ASPPrint.asp代码如下:   <%@ Language=VBScript %   <%        Option Explicit        Dim strSubmit          &...
计算系统与信息网络不停顿的运行与连接即高可用性已成为各行业特别是要求实时行业业务运行的基本要求。 惠普凭借丰富的经验创制的HP NetServer为您提供当今市场上最完备的高可用性系列产品和最优质的服务,使您的关键业务应用程序能连续可靠地高效运转。惠普还与业界领先的软硬件供应商联袂,为优化您的业务环境提供最...
随着计算机网络的普及,计算机病毒有了快速传播的机会,并且对数据文件的破坏日益严重,用户需要经常对个人重要数据做异地备份。基于多用户和数据隐私的考虑,提出了个人数据备份系统解决方案。它利用网络存储设备具有的大容量、高可靠性、高安全性特点,为用户提供一定容量的空间来保存个人数据,同时利用软件的权限管理很好地实现个人数...

经验教程

535

收藏

79
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部