在android中ScrollView嵌套ScrollView解决方案
难道就真的不能嵌套吗?当然可以,只要你再写一个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);
}
}
在android中ScrollView嵌套ScrollView解决方案相关推荐
- Android透明到白色滑动渐变,Android中Toolbar随着ScrollView滑动透明度渐变效果实现...
Android中Toolbar随着ScrollView滑动透明度渐变效果实现 一.思路:监听ScrollView的滑动事件 不断的修改Toolbar的透明度 二.注意 1.ScrollView 6.0 ...
- Android ScrollView嵌套ScrollView滚动的问题解决办法
引用:http://mengsina.iteye.com/blog/1707464 http://fenglog.com/article.asp?id=449 Android ScrollView嵌套 ...
- Android中RecyclerView嵌套RecyclerView或嵌套ListView
Android中RecyclerView嵌套RecyclerView或嵌套ListView
- [Android实例] [版主原创]ScrollView嵌套ScrollView
大家好,众所周知,android 里两个相同方向的ScrollView是不能嵌套的,那要是有这样的需求怎么办?(这个需求一般都是不懂android的人提出来的) 难道就真的不能嵌套吗? 当然可以,只要 ...
- Android中监听ScrollView滑动停止和滑动到底部
1.监听ScrollView滑动停止: [java] view plaincopy /********************监听ScrollView滑动停止********************* ...
- ScrollView嵌套ScrollView
原博客地址: http://www.eoeandroid.com/thread-240709-1-1.html 大家好,众所周知,android 里两个相同方向的ScrollView是不能嵌套的,那要 ...
- android 中RecyclerView 嵌套了 GridView 的用法
提醒一下 RecyclerView 安卓自带的当中是没有的,所以需要导入包的. android.support.v4.widget.SwipeRefreshLayout 中的v7,v4都已经变成 an ...
- Android中ScrollView嵌套WebView
2019独角兽企业重金招聘Python工程师标准>>> Android中WebView用来加载html页面,自带滑动效果.ScrollView同样也是自带滑动效果,在项目中如果需要W ...
- android中ScrollView嵌套ListView或GridView显示位置问题
Android中ScrollView中嵌套ListView或GridView时在开始进入界面时总是显示中间位置,开头的位置显示不出来.这种情况下只需要在ScrollView的父控件中添加以下两行代码即 ...
最新文章
- 用C++写一个没人用的ECS
- Native与H5交互的那些事
- HashMap 源码解析(JDK1.8)
- 《磨难之间》——刻意设计,缺失核心
- Ubuntu 更改ROOT密码的方法
- 【Java】带你走进Debug的世界
- 成都python工作少_成的解释|成的意思|汉典“成”字的基本解释
- 旷视孙剑团队提出AutoML神经架构搜索新方法:单路径One-Shot,更精确更省时
- python画科赫雪花
- 小米8android版本打开,怎么查看小米手机安卓系统版本
- 如何自己开发漏洞扫描工具
- OpenPDF 或 itext5 根据pdf模板生成多页PDF
- rtc校准算法_CRC校验算法的实例解析
- Zemax单透镜设计
- 捷讯fw300r虚拟服务器口号,迅捷FW300R开启UPnP功能
- 沧海拾珠(持续更新。。。)
- 计算机组成原理 — PCI-E 外设接口标准
- win7已经阻止此发行者在您的计算机上运行软件,win7系统打开特定网站提示“控件无法安装,windows已阻止此软件因为无法验证发行者”如何解决...
- 怎么调整计算机显示屏,电脑显示器画面怎么调整
- 如何将喜马拉雅FM的音频下载下来保存
热门文章
- JDK源码解析之java.util.Iterator和java.lang.Iterable
- Angular Material 阴影使用
- Ubuntu中安装python3
- 搞懂toString()与valueOf()的区别
- 迟到的年度总结,我们应该收放自如
- Python运行环境与异常处理
- Gram matrix 格拉姆矩阵
- JavaOne大事纪:IBM谈OpenJ9和Open Liberty
- CentOS 创建SVN 服务器,并且自动同步到WEB 目录
- 如何实现:判断数据库中某表是否有记录,若为空,则插入一条记录。若不为空则查询某记录...