❶ android怎么监听手指抬起屏幕的事件
一般情况下,你在MotionEvent.ACTION_UP或者MotionEvent.ACTION_POINTER_UP等UP事件的回调中处理即可,因为手指在屏幕上如果按着即使不动的情况下,其实Action_move仍在回调,就是用户比较难模拟出来那种完全手指按着屏幕一个像素点也没有动的情况。
或者你不想在UP事件中处理,那么就在Move中检测单位事件内移动的具体,比如100ms内如果用户手指移动距离小于你自己定义的阀值的话,可以认为用户没有移动手指。
写了半天才发现你问的不是这个问题。
你的问题可以通过先计算你将要滑动屏幕到的最终位置,然后通过判断你现在已经滑动到的位置,如果两个位置间的距离小于某个阀值比如一像素的话,那么就可以看做屏幕滑动停止了。
可以参考一下launcher中对屏幕滑动结束的处理逻辑。
❷ Android框架 ImageButton如何实现 按住和松开时的事件
这个可以用onTouch来实现,touch事件有手指按下,移动,放开的相关api。
关于Touch事件的说明:
1.关于事件构成
在Android中,事件主要包括点按、长按、拖拽、滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作。所有这些都构成了Android中的事件响应。总的来说,所有的事件都由如下三个部分作为耐森基础:
1.按下(ACTION_DOWN)
2.移动(ACTION_MOVE)
3.抬起(ACTION_UP)
所有的操作事件首先必须执行的是按下操作(ACTIONDOWN),之后所有的操作都是以按下操作作为前提,当按下操作完成后,接下来可能是一段移动(ACTIONMOVE)然后抬起(ACTION_UP),或者是按下操作执行完成后没有移动就直接抬起。这一系列的动作在Android中都可以进行控制。
2.事件的处理API
在View和ViewGroup中都存在dispatchTouchEvent和onTouchEvent方法,但是在ViewGroup中还有一个onInterceptTouchEvent方法,在Android中,所有的事件都是从开始经过传递到完成事件的卜亩耐消费,这些方法的返回值就决定了某一事件是否是继续往下传,还是被拦截了,或是被消费了。
public boolean dispatchTouchEvent(MotionEvent event)
public boolean onTouchEvent(MotionEvent event)
public boolean onInterceptTouchEvent(MotionEvent event)
3.事件处理API的说明
dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发,然后型春决定是自身消费当前事件还是继续往下分发给子控件处理。返回true表示不继续分发,事件没有被消费。返回false则继续往下分发,如果是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截该事件。
onTouchEvent方法用于事件的处理,返回true表示消费处理当前事件,返回false则不处理,交给子控件进行继续分发。
onInterceptTouchEvent是ViewGroup中才有的方法,View中没有,它的作用是负责事件的拦截,返回true的时候表示拦截当前事件,不继续往下分发,交给自身的onTouchEvent进行处理。返回false则不拦截,继续往下传。
❸ Android手势---GestureDetector
GestureDetector 可以使用 MotionEvents 检测各种手势和事件。
这个类只能用于检测触摸事件的 MotionEvent
GestureDetector有三个内部接口,两个内部类
他们都是起到监听器的作用
注意:SimpleOnGestureListener继承了GestureDetector的三个内部接口
GestureDetector自带了五个构造方法,但是有两个被废弃了
因为第三个调用第二个,所以只要关注前面两个就行了
我们发现第二个构造方法中多了一个Handler变量
一般来说,不会使用这个构造方法
但是因为GestureDetector中的数据是给GestureHandler内部类进行处理,这个类会使用Handle,由穗穗Handler的知识知道,创建Handler必须有Looper,但是在一些新开的线程中没有创建Looper,所以我们需要传入一个带了Looper的Handler变量,否则,GestureDetector对象会创建失败
按下是所以手势必定有的动作
所以无论什么手势,第一个调用的方法就是onDown
注意:
GestureDetector的点击对图片,按钮等无用
为了解决这个问题,我们可以
这两个方法都可以响应到单击事件,但是他们之间还是有区别的
当我们同时在监听器中覆写这两个方法,并且进行单击事件
我们会发现当进行单击事件的时候,这几个方法响应的顺序是这样的
首先onDown()必定是第一个执行的,但是会发现onSingleTapUp在onSingleComfirmed之前执行
我查阅了相关文档,发现他们虽然同样响应的是当手指离开屏幕的活动,但是 onSingleTapUp是立即执行 ,而 onSingleComfirmed却要在离开后300ms后才执行 ,这样悉世的目的是确认我们进行的是单击事件(为了防止我们在300ms内再次进行单击事件),所以他们的名字分别是Up和Comfirmed
所以,在 设置双击事件时,最好使用onSingleComfirmed(),进行双击时不会回调单击方法
这两个方法都可以响应双击事件,为了验证他们的区别,我们同样在一个响应器中覆写这两个方法,并且进行双击事件(我们这里单击事件使用onSingleComfirmed)
我们使用Log.e()把方法响应的顺序弄出来,发现他们规律很神奇
然后我在onDoubleTapEvent()中吧MotionEvent e 输出,
然后方法响应的顺序变成:
我们对以上信息进行分析:
DoubleTap在DoubleTapEvent前面执行,但是根据DoubleTapEvent的第一个MotionEvent是Down,所以判断 双击的响应条件是在第一次单击后的300ms内按下手指
我们又尝试在双击后手指不离开屏幕,可见随时间的延长,Move也变得更多,
由此判断, onDoubleTapEvent是实时回调的,并且是用来检测MotionEvent
这次我们在响应器中覆写所有方法,进行长按操作
发现方法响应的顺序为:
也就是说,在长按睁族肢时,onShowPress在onLongPress前面执行
同样,我们覆写所有方法,进行滑动操作,
发现方法的响应顺序为
由此可见,在滑动/拖动过程中,不断调用onScroll,最后调用onFiling
当然,Android自带的手势不能完全满足我们的需求,于是Android提供了自建手势的方法,这些内容将在下一篇博客中陈述