我们在开发中经常遇到滑动到下一页的情况可是哪一种情况是能滑动到下一页、或者说是留在原来页面呢。
滑动页面首先我们想到的就是viewpager这个简单好用的滑动页面控制可是很少有人知道里面到底是控制如何实现滑动的。
那就让我们来讲讲VelocityTracker这个获取滑动速度的对象。首先一般是得到最小滑动距离或者自己写一个距离来控制
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();这就是得到的最小滑动距离,其次当然是通过我们这个速度来判断是否到下一个页面,一般这个速度自己根据情况定义比如: private static final int SNAP_VELOCITY = 600;当达到这个速度后就滑动到下一个界面,反之则留在原页面。
然后我们从代码中来讲:重写ontouchevent,
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();//获取到VelocityTracker对象
}
mVelocityTracker.addMovement(event);//将你的滑动动作添加到该对象中。
case MotionEvent.ACTION_UP: //在手指抬起的时候
// Log.e(TAG, "event : up");
final VelocityTracker velocityTracker = mVelocityTracker;
velocityTracker.computeCurrentVelocity(1000);//意思为一秒时间内运动了多少个像素
int velocityX = (int) velocityTracker.getXVelocity();//得到你在x方向上运动的距离
// Log.e(TAG, "velocityX:"+velocityX);
if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {
// Log.e(TAG, "snap left");
scrollToScreen(mCurScreen - 1);//返回到上一页
} else if (velocityX < -SNAP_VELOCITY && mCurScreen < getChildCount() - 1) {
// Log.e(TAG, "snap right");
scrollToScreen(mCurScreen + 1);//滑动到下一页
} else {
scrollToDestination();//留在原来的页面
}
if (mVelocityTracker != null) {
mVelocityTracker.recycle();//回收这个对象
mVelocityTracker = null;
}
}
这是我们自己通过velocityTracker这个对象对其进行操作,还有一个onGesturelistener这个手势监听的,里面有个
onfling方法里面就有对velocityTracker封装,我们来看下下面一个例子
private int verticalMinDistance = 20; //最小滑动距离
private int minVelocity = 600; //最小滑动速度
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if
(e1.getX() - e2.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity) {
// 切换Activity
// Intent intent = new Intent(ViewSnsActivity.this, UpdateStatusActivity.class);
// startActivity(intent);
Toast.makeText(
this
,
"向左手势"
, Toast.LENGTH_SHORT).show();
}
else
if
(e2.getX() - e1.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity) {
// 切换Activity
// Intent intent = new Intent(ViewSnsActivity.this, UpdateStatusActivity.class);
// startActivity(intent);
Toast.makeText(
this
,
"向右手势"
, Toast.LENGTH_SHORT).show();
}
return
false
;
}