除了使用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);
}
}
}使用场景:惯性滑动,滑出界面并且回弹的效果。
本站广告由 Google AdSense 提供
0条评论