今天大概的学习了一下
VelocityTracker ,用来监控手势速度的,在View移动过程中,可以有个缓冲的移动。
我觉得初步的使用起来是很简单的。
首先移动依靠的是Scroller类,Scroller中有个fling的方法,将MotionEvent的Up之后检测的手势速度提供给scroller之后,就可以自己完成滚动。
1.初始化有些变量:
private void init(Context context){
mScroller = new Scroller(getContext());
final ViewConfiguration configuration = ViewConfiguration.get(context);
mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
}
configuration.getScaledTouchSlop()//获得能够进行手势滑动的距离
configuration.getScaledMinimumFlingVelocity()//获得允许执行一个fling手势动作的最小速度值
configuration.getScaledMaximumFlingVelocity()//获得允许执行一个fling手势动作的最大速度值
2.在触摸事件中处理:
@Override
public boolean onTouchEvent(MotionEvent event) {
obtainVelocityTracker(event); //初始化mVelocityTracker
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
startY = event.getY();
if (mScroller.isFinished()) {
mScroller.abortAnimation();
}
break;
case MotionEvent.ACTION_MOVE:
//求伪瞬时速度
float moveY = event.getY();
scrollTo(0, (int) (getScrollY() + (startY - moveY)));
startY = event.getY();
break;
case MotionEvent.ACTION_UP:
final VelocityTracker velocityTracker = mVelocityTracker;
velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
int initialVelocity = (int) velocityTracker.getYVelocity(); //获取Y轴的速度
if ((Math.abs(initialVelocity) > mMinimumVelocity) && getChildCount() > 0) {
fling(-initialVelocity); //开始滚动
}
case MotionEvent.ACTION_CANCEL:
releaseVelocityTracker(); //要释放掉
break;
}
return true;
}
/**
*释放mVelocityTracker
*/
private void releaseVelocityTracker() {
if(null != mVelocityTracker) {
mVelocityTracker.clear();
mVelocityTracker.recycle();
mVelocityTracker = null;
}
}
/**
*释放初始化
*/
private void obtainVelocityTracker( MotionEvent event) {
if(null == mVelocityTracker) {
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
}
down和move事件中就是简单的跟随手势移动了,主要的事件处理是在up中。
滚动的事件处理在fling方法中:
public void fling(int velocityY) {
mScroller.fling(getScrollX(), getScrollY(), 0, velocityY, 0, 0, -1080, 0); //就是scroller的一个方法而已,很简单。
awakenScrollBars(mScroller.getDuration());
invalidate();
}
fling(getScrollX(), getScrollY(), 0, velocityY, 0, 0, -1080, 0);
最小Y 最大Y
我的Demo中只是简单的Y轴上的滚动,所以设置了最小最大Y轴上的移动距离。最小Y 最大Y 都是说的ScrollY这个属性。
有Scroller这个类。就少不了computScroll方法。
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
int x = mScroller.getCurrX();
int y = mScroller.getCurrY();
scrollTo(x, y);
postInvalidate();
}
}
我的github地址:https://github.com/flyme2012
我的博客地址:http://www.cnblogs.com/flyme2012/