抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

Android手势以及拖拽总结

除了使用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条评论

发表评论