优化onFling()的滑动效果试验

想要做一个向左右滑动滚动的效果,虽然知道用onFling()这一个方法效果不太好,但是想要动手实现一下。

为了方便我们判断滑动动作,安卓给了我们一个叫做GestureDetector(手势识别器)的东西。

首先我们要在要使用滑动操作的activity(我这里为了减少重复代码,写一个基类让其他activity继承)里面重写一下onTouchEvent()方法

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		return super.onTouchEvent(event);
	}


然后我们new一个GestureDetector:

GestureDetector mDetector = new GestureDetector(android.content.Context, android.view.GestureDetector.OnGestureListener)
然后需要传入一个context对象和一个叫做OnGestureListener的东西

优化onFling()的滑动效果试验_第1张图片

从源码上看OnGestureListener里面封装一个我们今天要用到的方法OnFling()

然后它还有一个子类是封装了更简单的方法的,叫做SimpleOnGestureListener() 

优化onFling()的滑动效果试验_第2张图片

现在开始实现滑动效果:

首先把点击事件传进GestureDectector

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		mDectector.onTouchEvent(event);// 委托手势识别器处理触摸事件
		return super.onTouchEvent(event);
	}

然后,通过onFling()的四个参数来实现滑动效果

	mDectector = new GestureDetector(this, new SimpleOnGestureListener() {

			/**
			 * 监听手势滑动事件 e1表示滑动的起点,e2表示滑动终点 velocityX表示水平速度 velocityY表示垂直速度
			 */
			@Override
			public boolean onFling(MotionEvent e1, MotionEvent e2,
					float velocityX, float velocityY) {


				// 向右划,上一页
				if (e2.getRawX() - e1.getRawX() > 200) {
					showPreviousPage();
					return true;
				}

				// 向左划, 下一页
				if (e1.getRawX() - e2.getRawX() > 200) {
					showNextPage();
					return true;
				}

				return super.onFling(e1, e2, velocityX, velocityY);
			}
		});
	}
这样就基本实现了滑动的效果,但是为了效果更好,还可以优化一下。因为getRawX()方法是获取屏幕的X坐标,要是我们手指在滑动屏幕的起始位置与结束位置Y轴相差过大也能滑动页面,可能就会体验有些许不好,所以要加入Y轴上面的识别,要是起点与重点Y轴相差过大的话我们就不滚动屏幕,除了这种情况之外滑动速度我们也要限制一下,要是滑动速度过慢我们就让其不滚动,以免误操作。

	mDectector = new GestureDetector(this, new SimpleOnGestureListener() {

			/**
			 * 监听手势滑动事件 e1表示滑动的起点,e2表示滑动终点 velocityX表示水平速度 velocityY表示垂直速度
			 */
			@Override
			public boolean onFling(MotionEvent e1, MotionEvent e2,
					float velocityX, float velocityY) {

				// 判断纵向滑动幅度是否过大, 过大的话不允许切换界面
				if (Math.abs(e2.getRawY() - e1.getRawY()) > 100) {
					Toast.makeText(BaseSetupActivity.this, "不能这样划哦!",
							Toast.LENGTH_SHORT).show();
					return true;
				}

				// 判断滑动是否过慢
				if (Math.abs(velocityX) < 100) {
					Toast.makeText(BaseSetupActivity.this, "滑动的太慢了!",
							Toast.LENGTH_SHORT).show();
					return true;
				}

				// 向右划,上一页
				if (e2.getRawX() - e1.getRawX() > 200) {
					showPreviousPage();
					return true;
				}

				// 向左划, 下一页
				if (e1.getRawX() - e2.getRawX() > 200) {
					showNextPage();
					return true;
				}

				return super.onFling(e1, e2, velocityX, velocityY);
			}
		});
	}




你可能感兴趣的:(优化onFling()的滑动效果试验)