MotionEvent
- ACTION_DOW——手指刚接触屏幕
- ACTION_MOVE——手指移动
- ACTON_UP——手指松开屏幕
-
TouchSlop
系统能识别出是滑动的最小滑动距离,在不同设备上该值可能不同
通过以下代码可以获取该常量
ViewConfiguration.get(this).getScaledTouchSlop()
-
VelocityTracker
速度追踪,用于追踪手指的滑动速度
使用方法
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
// 设置时间间隔为1000ms,必须设置
velocityTracker.computeCurentVelocity(1000);
// 可能为负数,从右往左滑动
float xVelocity = velocityTracker.getXVelocity();
float yVelocity = velocityTracker.getYVelocity();
// 不使用的是否应重置并回收内存
velocityTracker.clear();
velocityTracker.recycle();
-
GestureDetector
手势检测,用于检测用户单击、滑动、长按、双击等行为
@Override
public boolean onTouchEvent(MotionEvent event) {
GestureDetector detector=new GestureDetector(this);
detector.setOnDoubleTapListener(this);
// 解决长按后无法拖动现象
detector.setIsLongpressEnabled(false);
// 接管事件
boolean b = detector.onTouchEvent(event);
return b;
}
实现OnGestureListener
接口
public interface OnGestureListener {
boolean onDown(MotionEvent e);
void onShowPress(MotionEvent e);
boolean onSingleTapUp(MotionEvent e);
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);
void onLongPress(MotionEvent e);
boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);
}
public interface OnDoubleTapListener {
boolean onSingleTapConfirmed(MotionEvent e);
boolean onDoubleTap(MotionEvent e);
boolean onDoubleTapEvent(MotionEvent e);
}
-
Scroller
弹性滑动对象,我们如果使用View中的scrollTo/scrollBy方法进行滑动时是瞬间完成的,没有过渡用户体验非常不好。使用Scroller和View的computerScroll方法可以实现弹性滑动
Scroller scroller = new Scroller(getContext());
public void scrollerTo(int destX, int destY) {
int scrollX = getScrollX();
int scrollY = getScrollY();
int deltaX = destX - scrollX;
int deltaY = destY - scrollY;
// 缓慢滑动,耗时1000ms
scroller.startScroll(scrollX, scrollY, deltaX, deltaY, 1000);
invalidate();
}
@Override
public void computeScroll() {
super.computeScroll();
if (scroller.computeScrollOffset()) {
scrollerTo(scroller.getCurrX(), scroller.getCurrY());
}
}
网友评论