除了使用onTouchEvent自己进行手势判断外,其实还可以通过Android提供的GestureDetector来进行手势监听。
GestureDetector
主要用途:点击、长按、双击、滑动等
使用方式:代理onTouchEvent
detector = new GestureDetector(context, gestureListener);
@Override public boolean onTouchEvent(MotionEvent event) { return detector.onTouchEvent(event); }
默认的回调监听器:OnGestureListener
各方法说明如下:
@Override public boolean onDown(MotionEvent e) { // 每次 ACTION_DOWN 事件出现的时候都会被调用,在这⾥返回 true 可以保证必然消费掉事件 return true; } @Override public void onShowPress(MotionEvent e) { // ⽤户按下 100ms 不松⼿后会被调⽤,⽤于标记「可以显示按下状态了」 } @Override public boolean onSingleTapUp(MotionEvent e) { // ⽤用户单击时被调⽤用(⻓长按后松⼿手不不会调⽤用、双击的第⼆二下时不不会被调⽤用) return false; } @Override public boolean onScroll(MotionEvent downEvent, MotionEvent event, float distanceX, float distanceY) { // ⽤户滑动时被调⽤ // 第⼀个事件是⽤户按下时的 ACTION_DOWN 事件,第二个事件是当前事件 // 偏移是按下时的位置 - 当前事件的位置 return false; } @Override public void onLongPress(MotionEvent e) { // ⽤户⻓按(按下 500ms 不松手)后会被调⽤ // 这个 500ms 在 GestureDetectorCompat 中变成了 600ms (???) } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // ⽤于滑动时迅速抬起时被调用,⽤于用户希望控件进行惯性滑动的场景 return false; }
双击监听器器:OnDoubleTapListener
设置方法:使用GestureDetector.setOnDoubleTapListener配置
detector.setOnDoubleTapListener(doubleTapListener);
回调方法:
private class OnDoubleTapListener implements GestureDetector.OnDoubleTapListener { @Override public boolean onSingleTapConfirmed(MotionEvent e) { // ⽤户单击时被调⽤和 onSingleTapUp() 的区别在于, // ⽤户的⼀次点击不会⽴即调用这个方法, // ⽽是在⼀定时间后(300ms),确认用户没有进⾏双击,这个方法才会被调⽤ return false; } @Override public boolean onDoubleTap(MotionEvent e) { // 用户双击时被调用 // 注意:第⼆次触摸到屏幕时就调用,⽽不是抬起时 return false; } @Override public boolean onDoubleTapEvent(MotionEvent e) { // ⽤户双击第二次按下时、第⼆次按下后移动时、第二次按下后抬起时都会被调⽤ // 常⽤用于「双击拖拽」的场景 return false; } }
OverScroller ⾃动计算滑动的偏移
创建:
OverScroller scroller = new OverScroller(context);
常⽤于手势回调方法 OnGestureListener.onFling() ⽅方法中,调用 OverScroller.fling() ⽅法来启动惯性滑动的计算:
@Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // ⽤于滑动时迅速抬起时被调⽤,⽤于⽤户希望控件进⾏惯性滑动的场景 // 初始化滑动 scroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY); // 下⼀一帧刷新 postOnAnimation(flingRunner); return false; }
然后创建一个runnable进行动画的循环:
private class FlingRunner implements Runnable { @Override public void run() { // 计算此时的位置,并且如果滑动已经结束,会返回false,此时就停⽌重复调用 if (scroller.computeScrollOffset()) { // 把此时的位置应用于界面 offsetX = scroller.getCurrX(); offsetY = scroller.getCurrY(); invalidate(); // 下一帧刷新 postOnAnimation(this); } } }
使用场景:惯性滑动,滑出界面并且回弹的效果。
本站由以下主机服务商提供服务支持:
0条评论