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

原创 2014年12月23日 10:25:54

之前在使用网易新闻的时候,左右滑动页面可以打开和关闭新的页面,对于这个功能一直很喜欢,刚好今天有空,工作不忙,于是就抽空把这个功能写出来了,其实用到的都是很简单的手势监听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) < mTouchSlop) {
				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) < mTouchSlop) {
				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 Fragment上下左右滑动onFling的手势识别

import android.os.Bundle; import android.view.GestureDetector; import android.view.LayoutInflater; i...
  • qq_30552993
  • qq_30552993
  • 2016年03月30日 11:05
  • 1589

android Activity右滑返回,退出当前activity

发现目前很多app应用,都具有左滑返回的功能,而且感觉体验很是愉快,尤其酷狗音乐左滑返回的实现,更是炫酷。今天就学习了,具体实现。先看一下效果图吧:准备: 有两种方案:1:添加库文件(推荐用这种...
  • da_caoyuan
  • da_caoyuan
  • 2016年12月30日 12:00
  • 2431

Android开发:获取当前view的左右滑动事件

  • 2014年12月23日 10:23
  • 1.88MB
  • 下载

Android开发监听返回键返回上个网页或者fragment

最近呢,在做项目中,遇到了一个很坑的问题!现在项目做完了,趁着项目审核的时间,来给大家整理一下我当时遇到的问题以及解决方法! 我们的项目中由于嵌了很多的H5页面,使用H5当然很方便,但是和方便接...
  • u014778883
  • u014778883
  • 2014年12月10日 15:46
  • 2131

从当前fragment或者activity跳到另一个activity,当返回时需要获得一些值或执行一些函数

相关函数: startActivityForResult(Intent intent, Int requestCode) setResut(int resultCode, Intent inten...
  • lxsjt
  • lxsjt
  • 2016年08月17日 20:00
  • 166

Android开发:ViewPager+Fragment满足内容区域左右滑动

Fragment作为Activity界面的一部分组成出现 可以在一个Activity中同时出现多个Fragment,并且,一个Fragment亦可在多个Activity中使用。 在Activity...
  • u014071328
  • u014071328
  • 2015年05月08日 18:51
  • 577

Android activity加入左右监听手势,页面是一个listview,不影响listview的点击事件

  • 2016年01月26日 12:13
  • 6.08MB
  • 下载

android开发笔记之activity 左右滑动的实现

这是一个在activity中左右滑动的实现样例: 在activity中: origin code: 1.包文件: //hongyu hexiaoming mms 20131225 start i...
  • hfreeman2008
  • hfreeman2008
  • 2013年12月26日 16:22
  • 1751

Android开发 获取当前activity的屏幕截图

首先通过下面的函数获取Bitmap格式的屏幕截图: ? 1 2 3 4 5 6 7 8 9 10 11 ...
  • joxpeng
  • joxpeng
  • 2015年08月11日 12:43
  • 196

Android开发中关于获取当前Activity的一些思考

在Android开发过程中,我们有时候需要获取当前的Activity实例,比如弹出Dialog操作,必须要用到这个。关于如何实现由很多种思路,这其中有的简单,有的复杂,这里简单总结一下个人的一些经验吧...
  • Listron
  • Listron
  • 2016年07月01日 17:36
  • 488
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android开发:监听当前View的左右滑动事件,并返回给当前的activity或者fragment
举报原因:
原因补充:

(最多只允许输入30个字)