Android scrollview如何监听滑动状态
时间:2022-07-27
本文章向大家介绍Android scrollview如何监听滑动状态,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
ScrollView
视图的滚动过程,其实是在不断修改原点坐标。当手指触摸后,ScrollView会暂时拦截触摸事件,使用一个计时器。假如在计时器到点后没有发生手指移动事件,那么ScrollView发送tracking events到被点击的subView;若是在计时器到点后发生了移动事件,那么ScrollView取消tracking自己促发滚动。
首先说一下NestedScrollView 的滑动事件的监听,
如果使用
nestedScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
}
});
这个方法在 API = 23 时才可以使用,怎么解决呢 。我们可以自己定义一个ScrollView
public class MyScrollView extends NestedScrollView {
private OnScrollChanged mOnScrollChanged;
public MyScrollView(Context context) {
this(context, null);
}
public MyScrollView(Context context, AttributeSet attributeSet) {
this(context, attributeSet, 0);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mOnScrollChanged != null) {
mOnScrollChanged.onScroll(l, t, oldl, oldt);
}
}
public void setOnScrollChanged(OnScrollChanged onScrollChanged) {
this.mOnScrollChanged = onScrollChanged;
}
public interface OnScrollChanged {
void onScroll(int l, int t, int oldl, int oldt);
}
}
这样我们就可以通过实现 onScrollChanged() 监听滑动事件了 ,其中可以监测到滑动距离,这样就可以做好多事情了;
但是现在有一个需求就是【滑动的时候隐藏 一个靠边的悬浮框,不滑动是悬浮框显示出来】,这样的话就需要监测滑动状态了。scrollview 不像recyclerview一样可以监测滑动状态。
以下是我的一个实现方案,通过CountDownTimer 来实现
在刚才的onScrollChanged 接口中增加方法
public interface OnScrollChanged {
void onScroll(int l, int t, int oldl, int oldt);
void onTouch(boolean isDown);
}
然后重写onTouchEvent方法
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (mOnScrollChanged != null) {
mOnScrollChanged.onTouch(false);
}
break;
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
if (mOnScrollChanged != null) {
mOnScrollChanged.onTouch(true);
}
break;
}
return super.onTouchEvent(ev);
}
这里的isDown=true代表是按下或者滑动的状态,对应ACTION_DOWN和ACTION_MOVE,fale代表ACTION_UP和ACTION_CANCEL
下面使用这个自定义的scrollerview
//静止状态
private final static int SCROLL_STATE_IDLE = 1;
//拖动或者惯性滑动状态
private final static int SCROLL_STATE_SCROLL = 2;
//判断是否是拖动状态
boolean isDragState = false;
int currentState = SCROLL_STATE_IDLE;
//这里采用100ms来判断是否已经是静止状态,100ms结束后证明是静止状态
private CountDownTimer scrollCountTimer = new CountDownTimer(100, 1) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
setScrollState(SCROLL_STATE_IDLE);
}
};
private void initScrollView() {
scrollView.setOnScrollChanged(new MyScrollView.OnScrollChanged() {
@Override
public void onScroll(int l, int t, int oldl, int oldt) {
if (isDragState) {//拖动状态单独处理不再进行滚动状态监测
return;
}
//滑动时先取消倒计时,设置滑动状态
scrollCountTimer.cancel();
if(currentState != SCROLL_STATE_SCROLL) {
setScrollState(SCROLL_STATE_SCROLL);
}
scrollCountTimer.start();
}
@Override
public void onTouch(boolean isDown) {
isDragState = isDown;
//我这里把按下的状态默认为了滚动的状态,当然你也可以分开定义
if (isDown) {
scrollCountTimer.cancel();
setScrollState(SCROLL_STATE_SCROLL);
} else {
scrollCountTimer.start();
}
}
});
//最后记得页面销毁时,cancel掉timer
总结
以上所述是小编给大家介绍的Android scrollview如何监听滑动状态,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
- 零基础学编程015:画些有趣的图案
- Spring boot with Thymeleaf
- 零基础学编程014:小海龟做画
- Springboot @RequestBody 传递 List
- 零基础学编程013:import让你飞起来
- 【教程】利用Tensorflow目标检测API确定图像中目标的位置
- 零基础学编程012:画出复利曲线图
- OpenAI发布高度优化的GPU计算内核—块稀疏GPU内核
- SQL SERVER 原来还可以这样玩 FOR XML PATH
- 零基础学编程011:复利数据表问题(总结)
- 一个小程序引发的思考
- 深入内核:DUMP Block的数据读取与脏数据写入影响
- 零基础学编程010:最终可以输出完整的复利数据表了
- 在C#使用文件监控对象FileSystemWatcher 实现数据同步
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- [Go] Golang发送http GET请求
- Windows系统快速安装Superset 0.37
- 商业数据分析从入门到入职(3)Excel进阶应用
- python列表练习
- python元组
- python字典、集合
- 秒懂JVM的三大参数类型,就靠这十个小实验了
- Netty之旅三:Netty服务端启动源码分析,一梭子带走!
- Mysql几种join连接算法
- Flutter 学习笔记 16 - Hero 动画
- sdk冲突记录
- 个人账号密码管理体系(密码篇)
- 熬夜7天,我总结了JavaScript与ES的25个重要知识点!
- 【分享】MPSoC SWDT在Standalone下的应用
- 【分享】 PetaLinux工程出现大量Taskhash mismatch错误的原因