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

之前在使用网易新闻的时候,左右滑动页面可以打开和关闭新的页面,对于这个功能一直很喜欢,刚好今天有空,工作不忙,于是就抽空把这个功能写出来了,其实用到的都是很简单的手势监听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开发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭