Android中系统触摸相关辅助类总结

本文总结了Android中用于处理触摸事件的三个核心辅助类:GestureDetector用于手势识别,如单击、长按、滑动;ViewDragHelper帮助实现子控件拖拽,简化触摸事件处理;ItemTouchHelper则专注于RecyclerView的条目拖拽和滑动操作。通过这些辅助类,开发者可以更高效地实现复杂的触摸交互功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android中系统触摸相关辅助类总结

Android中的触摸事件,我们可以通过重写View的OnTouchEvent()等事件,通过事件类型MotionEvent来进行我们想要实现的逻辑操作,有时候一些简单的需求很容易实现,但是有时候,一些很困难的需求,我们需要编写大量的代码来实现。好在Android官方就给我们提供了很丰富的触摸相关的辅助类,今天,我就把我知道的分享给大家。

1、GestureDetector(手势探测器)

顾名思义,GestureDetector可以很方便的帮我们识别出我们当前在屏幕上的手势操作,比如按下、长按、抬起、双击、滚动、快速滑动(惯性滑动)等,甚至它还能识别出是否是鼠标右键点击的动作,省去了我们大量的手势判断语句,非常的实用。

1.1 相关的方法及接口简介

GestureDetector的手势识别有三个接口来处理我们当前的手势动作,还有一个集成了三个接口的实现类方便我们去处理多种事件。

1.1.1 GestureDetector.OnGestureListener

作用: 用来监听单击、长按、滑动等操作,我们可以在这些操作的回调方法中处理我们自己的逻辑。

具体实现方法:
见下面代码,注释已经写的很清楚了,示例代码中仅仅对滚动进行了处理。

    private static class MyGestureDetectorListener implements GestureDetector.OnGestureListener{

        private GestureDetectorView mView;

        public MyGestureDetectorListener(GestureDetectorView view){
            this.mView = view;
        }

        /**
         * 用户按下屏幕的时候回调
         * @param motionEvent
         * @return
         */
        @Override
        public boolean onDown(MotionEvent motionEvent) {
            Log.e("ll", "MyGestureDetectorListener : onDown");
            return true;
        }

        /**
         * 用户按下屏幕100ms后,如果还没有松手或者移动就会回调
         * @param motionEvent
         */
        @Override
        public void onShowPress(MotionEvent motionEvent) {
            Log.e("ll", "MyGestureDetectorListener : onShowPress");
        }

        /**
         * 单纯的点击再抬手时调用。用户手指松开(UP事件)的时候如果没有执行onScroll()和onLongPress()这两个回调的话,就会回调
         * @param motionEvent
         * @return
         */
        @Override
        public boolean onSingleTapUp(MotionEvent motionEvent) {
            Log.e("ll", "MyGestureDetectorListener : onSingleTapUp");
            return false;
        }

        /**
         * 屏幕拖动事件,如果按下的时间过长,调用了onLongPress,再拖动屏幕不会触发onScroll。
         * 拖动屏幕会多次触发
         * @param motionEvent 开始拖动的第一次按下down操作,也就是第一个ACTION_DOWN
         * @param motionEvent1 触发当前onScroll方法的ACTION_MOVE
         * @param distanceX 当前的x坐标与最后一次触发scroll方法的x坐标的差值。
         * @param distanceY 当前的y坐标与最后一次触发scroll方法的y坐标的差值。
         * @return
         */
        @Override
        public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float distanceX, float distanceY) {
            Log.e("ll", "MyGestureDetectorListener : onScroll : " + distanceY);
            mView.scrollBy(0, (int) distanceY);
            return false;
        }

        /**
         * 用户长按后(好像不同手机的时间不同,源码里默认是100ms+500ms)触发,触发之后不会触发其他回调,直至松开(UP事件)。
         * @param motionEvent
         */
        @Override
        public void onLongPress(MotionEvent motionEvent) {
            Log.e("ll", "MyGestureDetectorListener : onLongPress");
        }

        /**
         * 按下屏幕,在屏幕上快速滑动后松开,由一个down,多个move,一个up触发
         * @param motionEvent 开始快速滑动的第一次按下down操作,也就是第一个ACTION_DOWN
         * @param motionEvent1 触发当前onFling方法的move操作,也就是最后一个ACTION_MOVE
         * @param velocityX X轴上的移动速度,像素/秒
         * @param velocityY Y轴上的移动速度,像素/秒
         * @return
         */
        @Override
        public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float velocityX, float velocityY) {
            Log.e("ll", "MyGestureDetectorListener : onFling");
            return false;
        }
    }

注意事项:

1、onDown()方法返回true时,onScroll()onFling()方法才能回调。
2、onLongPress()若触发了,则不会再触发其他回调。
3、事件回调顺序:

  • 快速点击:onDown() > onSingleTapUp()
  • 慢按屏幕:onDown() > onShowPress() > onSingleTapUp()
  • 长按屏幕:onDown() > onShowPress() > onLongPress()
  • 滑动屏幕:onDown() > onShowPress() > onScroll()(多个) > onFling()
  • 快速拖动屏幕后松手:onDown() > onScroll()(多个) > onFling()
1.1.2 GestureDetector.OnDoubleTapListener

作用: 用来监听双击事件操作,我们可以在这些操作的回调方法中处理我们自己的逻辑。

具体实现方法:
见下面代码,注释已经写的很清楚了。

private static class MyGestureDetectorDoubleTapListener implements GestureDetector.OnDoubleTapListener{

    /**
     * 单击事件。用来判定该次点击是单纯的SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,
     * 如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。
     * @param motionEvent
     * @return
     */
    @Override
    public boolean onSingleTapConfirmed(MotionEvent motionEvent) {
        Log.e("ll","MyGestureDetectorDoubleTapListener : onSingleTapConfirmed");
        return false;
    }

    /**
     * 双击触发
     * @param motionEvent
     * @return
     */
    @Override
    public boolean onDoubleTap(MotionEvent motionEvent) {
        Log.e("ll","MyGestureDetectorDoubleTapListener : onDoubleTap");
        return false;
    }

    /**
     * 双击间隔中发生的动作。指触发onDoubleTap以后,在双击之间发生的其它动作,包含down、up和move事件
     * @param motionEvent
     * @return
     */
    @Override
    public boolean onDoubleTapEvent(MotionEvent motionEvent) {
        Log.e("ll","MyGestureDetectorDoubleTapListener : onDoubleTapEvent");
        return false;
    }
}

注意事项:
1、onSingleTapConfirmed()用来判断是不是单点事件,双击不会执行此方法。
2、事件调用顺序:

  • 单击屏幕时: OnDown() > OnsingleTapUp() > OnsingleTapConfirmed()
  • 双击屏幕时: OnDown() > onSingleTapUp() > onDoubleTap() > onDoubleTapEvent() > onDown() > onDoubleTapEvent()
1.1.3 GestureDetector.OnContextClickListener

作用: 用来监听鼠标右键按下的事件,我们可以在这些操作的回调方法中处理我们自己的逻辑。

具体实现方法:
见下面代码,注释已经写的很清楚了。

private static class MyGestureDetectorContextClickListener implements GestureDetector.OnContextClickListener{

    /**
     * 当鼠标/触摸板,右键点击时候的回调。
     * @param motionEvent
     * @return
     */
    @Override
    public boolean onContextClick(MotionEvent motionEvent) {
        return false;
    }
}

注意事项:
1、OnContextClickListener接口最低支持的API是23。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值