热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android开发:监听当前View的左右滑动事件,并返回给当前的activity或者fragment

之前在使用网易新闻的时候,左右滑动页面可以打开和关闭新的页面,对于这个功能一直很喜欢,刚好今天有空,工作不忙,于是就抽空把这个功能写出来了,其实用到的都是很简单的手势监听api,加入了一些判断,核心代

之前在使用网易新闻的时候,左右滑动页面可以打开和关闭新的页面,对于这个功能一直很喜欢,刚好今天有空,工作不忙,于是就抽空把这个功能写出来了,其实用到的都是很简单的手势监听api,加入了一些判断,核心代码如下:


1、在onInterceptTouchEvent中,判断是否属于滑动(还是无意触碰),是的话,就拦截该touchevent,然后传递给onTouchEvent,不是的话,默认传递给下一层view

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = mTempX = (int) ev.getRawX();
mDownY = (int) ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) ev.getRawX();
// 满足此条件屏蔽SildingFinishLayout里面子类的touch事件
if (Math.abs(moveX - mDownX) > mTouchSlop
&& Math.abs((int) ev.getRawY() - mDownY) return true;
}
break;
}

return super.onInterceptTouchEvent(ev);
}


2、在onTouchEvent中处理滑动事件,在手指离开屏幕的时候,判断滑动距离,如果超过view宽度的1/3,就认为是有效的滑动,用interface回调该事件:

@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
int moveX = (int) event.getRawX();
int deltaX = mTempX - moveX;
//Log.i("debug", "deltaX:" + deltaX + "mTouchSlop:" + mTouchSlop);
mTempX = moveX;
if (Math.abs(moveX - mDownX) > mTouchSlop
&& Math.abs((int) event.getRawY() - mDownY) isSilding = true;
}

if (Math.abs(moveX - mDownX) >= 0 && isSilding) {
//mContentView.scrollBy(deltaX, 0);
totalMoveX += deltaX;
}
break;
case MotionEvent.ACTION_UP:
isSilding = false;
//Log.i("debug", "TotoalMoveX:" + totalMoveX + "viewVidth:" + viewWidth);
if (Math.abs(totalMoveX) >= viewWidth / 3) {
if (totalMoveX > 0) {
swipeListener.onLeftSwipe();
}else {
swipeListener.onRightSwipe();
}
}
totalMoveX = 0;
break;
}

return true;
}


3、最后一步,就是在activity中,引用该回调,事件滑动的监听:

gestureLayout.setSwipeGestureListener(new onSwipeGestureListener() {

@Override
public void onRightSwipe() {
Log.i("debug", "onRightSwipe");
}

@Override
public void onLeftSwipe() {
Log.i("debug", "onLeftSwipe");
}
});


到此及可以实现监听手势的滑动了,不过这只是一个简单的demo,有以下两个缺陷,还带优化:

1、如果view里面嵌套的是viewpager,就会导致viewpager无法滑动,因为touch事件被拦截了;

2、如果是listview的话,因为我检测是左右滑动的,因为没有问题,不过没有测试过,不敢保证;


最后,附上源码,供参考


推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • macOS命令行创建Android模拟器
    macOS下不安装AndroidStudio使用VSCode来开发Flutter应用使用命令行创建和管理Android模拟器设备avdmanageravdmanager 是一种命令 ... [详细]
author-avatar
so的青春
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有