Android手势处理及模拟滑动事件

    xiaoxiao2021-12-13  23

    按键或者触摸屏事件产生以后,触摸屏驱动程序会依据事件的类别按照操系统对事件的定义将事件告诉操作系统。Android操作系统中存在一个WindowManagerService服务,此服务会将收到的事件分发给当前可见的Activity,Activity同时会将事件分发给此Activity中的控件,如果Activity中实现了手势或者触摸事件的处理,则会调用Activity的事件处理函数,同样Activity中的控件如果实现了相应事件的处理函数,则会调用此控件的事件处理函数。 GestureDetector类内部有三个接口OnGestureListener接口(用于实现各种手势的事件处理)和OnDoubleTapListener接口(用于实现双击事件的处理)和OnContextClickListener接口以及一个内部类SimpleOnGestureListener,内部类SimpleOnGestureListener实现了上述三个接口,但是接口函数都是空的。如果我们想实现新的事件处理,可以继承GestureDetector的内部类SimpleOnGestureListener实现我们感兴趣的的事件,或者实现GestureDetector的内部接口,根据需要实现的事件不同需要实现不同的接口。 OnGestureListener接口中定义的手势处理接口有如下6个接口: (1)OnDown:用户轻触触摸屏,由一个MotionEvent.ACTION_DOWN触发(按下立即触发)。 (2)onShowPress:用户轻触触摸屏,尚未松开或者拖动,由一个MotionEvent.ACTION_DOWN。(用户按下之后不会立即触发,而是一段时间之后没有松开的话才会触发) (3)OnSingleTapUP:用户轻触触摸屏后松开,由一个MotionEvent.ACTION_UP触发。 (4)OnScroll:用户按下触摸屏并拖动,由一个MotionEvent.ACTION_DOWN多个MotionEvent.ACTION_DOWN触发。 (5)OnLongPress:用户长按触摸屏,由多个MotionEvent.ACTION_DOWN触发。 (6)OnFling:用户按下触摸屏快速移动后松开,由一个MotionEvent.ACTION_DOWN多个MotionEvent.ACTION_MOVE和触发一个MotionEvent.ACTION_UP触发。第一个ACTION_MOVE和ACTION_DOWN坐标,时间点是一样的,即除了ACTION不同以外其它信息是相同的。最后一个ACTION_MOVE和ACTION_UP除了ACTION不同以外其它信息也是一样的。 我们了解了事件触发的机制,可以利用Android系统提供的接口以软件的方式模拟各种事件的发生。我们以onFling事件为例: Instrumentation inst = new Instrumentation(); long dowTime = SystemClock.uptimeMillis(); inst.sendPointerSync(MotionEvent.obtain(dowTime,dowTime, MotionEvent.ACTION_DOWN, x, y,0)); inst.sendPointerSync(MotionEvent.obtain(dowTime,dowTime, MotionEvent.ACTION_MOVE, x, y,0)); inst.sendPointerSync(MotionEvent.obtain(dowTime,dowTime+20, MotionEvent.ACTION_MOVE, x+20, y,0)); inst.sendPointerSync(MotionEvent.obtain(dowTime,dowTime+30, MotionEvent.ACTION_ MOVE, x+40, y,0)); inst.sendPointerSync(MotionEvent.obtain(dowTime,dowTime+40, MotionEvent.ACTION_ MOVE, x+60, y,0)); inst.sendPointerSync(MotionEvent.obtain(dowTime,dowTime+40, MotionEvent.ACTION_UP, x+60, y,0));  一个.ACTION_DOWN多个ACTION_MOVE以及一个ACTION_UP即可触发onFling事件。
    转载请注明原文地址: https://ju.6miu.com/read-950212.html

    最新回复(0)