在android中ScrollView嵌套ScrollView解决方案

本文介绍如何在Android中实现两个ScrollView的嵌套使用,包括核心代码解析、功能实现及效果展示。通过自定义ScrollView类,支持嵌套并解决上下滚动需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

方案是为解决特定问题或达成特定目标而制定的一系列计划或步骤。它的作用是提供一种系统性的方法,以有效地应对挑战、优化流程或实现目标。以下是方案的主要作用: 问题解决: 方案的核心目标是解决问题。通过系统性的规划和执行,方案能够分析问题的根本原因,提供可行的解决方案,并引导实施过程,确保问题得到合理解决。 目标达成: 方案通常与明确的目标相关联,它提供了一种达成这些目标的计划。无论是企业战略、项目管理还是个人发展,方案的制定都有助于明确目标并提供达成目标的路径。 资源优化: 方案在设计时考虑了可用资源,以最大化其效用。通过明智的资源分配,方案可以在有限的资源条件下实现最大的效益,提高效率并减少浪费。 风险管理: 方案通常会对潜在的风险进行评估,并制定相应的风险管理策略。这有助于减轻潜在问题的影响,提高方案的可行性和可持续性。 决策支持: 方案提供了决策者所需的信息和数据,以便做出明智的决策。这种数据驱动的方法有助于减少不确定性,提高决策的准确性。 团队协作: 复杂的问题通常需要多个人的协同努力。方案提供了一个共同的框架,帮助团队成员理解各自的职责和任务,促进协作并确保整个团队朝着共同的目标努力。 监控与评估: 方案通常包括监控和评估的机制,以确保实施的有效性。通过定期的评估,可以及时调整方案,以适应变化的环境或新的挑战。 总体而言,方案的作用在于提供一种有序、有计划的方法,以解决问题、实现目标,并在实施过程中最大化资源利用和风险管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值