想要做一个向左右滑动滚动的效果,虽然知道用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的东西
从源码上看OnGestureListener里面封装一个我们今天要用到的方法OnFling()
然后它还有一个子类是封装了更简单的方法的,叫做SimpleOnGestureListener()
现在开始实现滑动效果:
首先把点击事件传进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);
}
});
}