滑动到底部或顶部响应的ScrollView实现

简介:

本文主要介绍实现ScrollView滑动到底部或顶部响应的两种方式

关于使用可见:滚动到底部或顶部响应的ScrollView使用

示例APK可从这些地址下载:Google Play, 360手机助手, 百度手机助手, 小米应用商店, 豌豆荚

两种实现方式的主要不同点在于判断滑动位置的地方,第一种方式在onScrollChanged函数中判断, 第二种在OnTouchListener的onTouch中判断。其他如是否滚动到边缘的判断、响应事件接口OnBorderListener、对外暴露的接口都一样。

第一种方式代码可见onScrollChanged BorderScrollView
第二种方式代码可见OnTouchListener BorderScrollView

1、判断是否已经滚动到顶部或底部,代码如下:

Java

1

2

3

4

5

6

7

8

9

10

11

private void doOnBorderListener() {

if (contentView != null && contentView.getMeasuredHeight() <= getScrollY() + getHeight()) {

if (onBorderListener != null) {

onBorderListener.onBottom();

}

} else if (getScrollY() == 0) {

if (onBorderListener != null) {

onBorderListener.onTop();

}

}

}

滚动到顶部判断:getScrollY() == 0
滚动到底部判断

1

2

View contentView = getChildAt(0);

contentView.getMeasuredHeight() <= getScrollY() + getHeight();

其中getChildAt表示得到ScrollView的child View,因为ScrollView只允许一个child view,所以contentView.getMeasuredHeight()表示得到子View的高度, getScrollY()表示得到y轴的滚动距离,getHeight()为scrollView的高度。当getScrollY()达到最大时加上scrollView的高度就的就等于它内容的高度了啊~

2、定义到达顶部和底部响应事件接口OnBorderListener,包含onTop和onBottom函数

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/**

* OnBorderListener, Called when scroll to top or bottom

*

* @author Trinea 2013-5-22

*/

public static interface OnBorderListener {

/**

* Called when scroll to bottom

*/

public void onBottom();

/**

* Called when scroll to top

*/

public void onTop();

}

这个接口允许用户自定义到达底部和顶部的响应事件

第一种方式: 在onScrollChanged函数中判断,主要代码如下:

Java

1

2

3

4

5

@Override

protected void onScrollChanged(int x, int y, int oldx, int oldy) {

super.onScrollChanged(x, y, oldx, oldy);

doOnBorderListener();

}

在ScrollView的onScrollChanged函数中判断是否到达顶部和底部,并进行相应事件调用,onScrollChanged函数在ScrollView中内容开始滚动时出发被调用。

第二种方式: 在OnTouchListener的onTouch中判断,主要代码如下:

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

this.onBorderTouchListener = new OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_UP:

doOnBorderListener();

break;

}

return false;

}

};

表示在touch结束后,手指拿起时执行doOnBorderListener,进行判断和响应。

两种方式的比较:
第一种方式精确度高,但doOnBorderListener可能执行多次,因为ScrollView滑动中,onScrollChanged总是在不停被调用,需要用户自己做并发控制,也可以参考DropDownListView的写法让用户在自定义Listener执行结束后手动调用onBottomComplete函数。

第二种方式不会造成doOnBorderListener多次执行,但却可能一次都没有调用。比如你快速滑动,还未到达底部手指已经松开,由于惯性滚动到底部,可能并不会执行doOnBorderListener。因为onTouch的ACTION_UP事件在手指松开已经接收到这时候却还没有到达底部。

两种方式各有优劣,大家可酌情选择。我要求准确响应,所以选择了第一种,自己再做下控制确保不会多次执行。

目录
相关文章
|
存储 传感器 自动驾驶
几种常见的点云格式数据解析与在线预览
3D模型在线转换网站支持pcd、pts、xyz、las、laz、asc、ply等点云格式文件在线预览,同时支持将点云格式在线转换为ply、xyz等模型格式。
6802 1
|
机器学习/深度学习 算法 数据可视化
Machine Learning机器学习之高维数据降维(主成分分析PCA、线性判别分析、自编码器超级无敌详细讲解)
Machine Learning机器学习之高维数据降维(主成分分析PCA、线性判别分析、自编码器超级无敌详细讲解)
|
10月前
|
Java 网络安全 开发工具
Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合
通过本文,读者可以深入了解Git的核心概念和实际操作技巧,提升版本管理能力。
|
JavaScript 算法 前端开发
layui框架实战案例(16):xm-select下拉多选插件实战记录(远程搜索、过滤、翻页、单选、提示文字)
layui框架实战案例(16):xm-select下拉多选插件实战记录(远程搜索、过滤、翻页、单选、提示文字)
2882 0
|
数据可视化 JavaScript 前端开发
Matplotlib动画制作:让数据生动起来!
Matplotlib动画制作:让数据生动起来!
255 0
|
8月前
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
244 0
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
|
人工智能 决策智能 iOS开发
新Siri解锁万能Agent?魔搭开源移动端框架Mobile-Agent-v2抢先体验!
在刚结束的苹果全球开发者大会WWAC上,Apple家族AI全家桶 「Apple Intelligence」亮相,库克宣布个人智能系统将应用于新版本的 iPhone、iPad 和 Mac 操作系统。
|
Web App开发 测试技术 API
Playwright 测试报告中显示的标签和注释。
Playwright 测试报告中显示的标签和注释。
264 57
|
编译器
R 语言教程 之 R 注释
R语言中的注释仅支持单行注释,使用#符号。多行注释可通过每行添加#或使用if(FALSE){}结构实现。注释帮助理解代码,但不参与执行。示例包括简单的打印语句和两数相加。
404 4
|
缓存 分布式计算 NoSQL
大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念
大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念
253 2