在android中ScrollView嵌套ScrollView解决方案

在android中ScrollView嵌套ScrollView解决方案,第1张

概述大家好,众所周知,android里两个相同方向的ScrollView是不能嵌套的,那要是有这样的需求怎么办?(这个需求一般都是不懂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,getScrollY(),getScrollRange(),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,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解决方案全部内容,希望文章能够帮你解决在android中ScrollView嵌套ScrollView解决方案所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1142596.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存