View的事件体系---View 基础知识
MotionEvent
ACTION_DOWN --手指刚接触到屏幕
ACTION_MOVE ---手指在屏幕上移动
ACTION_UP ----手指从屏幕上松开的一瞬间
TouchSlop
TouchSlop 是指系统所能识别出的被认为是滑动的最小距离,换句话来说,当手指在屏幕上滑动时,如果两次滑动之间的距离小于这个常量,那么系统不认为你在进行滑动操作。
这个值 跟设备有关,在不同的设备上这个值是不同的,获取方法:ViewConfiguration.get(getContext()).getScaledTouchSlop()。
在frameworks/base/core/res/res/values/config.xml 中可以查到
config_viewConfigurationTouchSlop id
GestureDetector
手势检测,用于辅助检测用户的单击,滑动,长按,双击等行为
使用方法如下:
首先需要创建一个GestureDetector 对象并实现onGestureListener接口,根据需要我们还可以实现onDoubleTapListener 从而能够监听双击行为
GestureDetector mGestureDetector = new GestureDetector(this);
//解决长按屏幕后无法拖动的现象
mGestureDetector.setIsLongpressEnabled(false);
接着 接管目标View 的 onTouchEvent 方法,在待监听View的onTouchEvent 方法中添加如下实现
boolean consume = mGestureDetector.onTouchEvent(event);
return consume;
做完上面两步,我们就可以有选择的实现onGestureListener 和 onDoubleTapListener 中的方法了。
Scroller 弹性滑动对象,用于实现View的弹性滑动。
它的典型代码如下
Scroller scroller = new Scroller(mContext);
//缓慢滚动到指定位置
private void smoothScrollTo(int destX,int destY){
int scrollX = getScrollX( );
int delta = destX - scrollX;
//1000ms 内滑向destX,效果就是慢慢滑动
mScroller.startScroll(scrollX,0,delta,0,1000);
invalidate( );
}
@Override
public void computeScroll( ){
if( mScroller.computeScrollOffset( )){
scrollTo( mScroller.getCurrX( ) , mScroller.getCurrY( ) ) ;
postInvalidate( );
}
}