151020_example_GestureDetector详解

来源:互联网 发布:midas有限元分析软件 编辑:程序博客网 时间:2024/06/06 13:16

啰嗦几句,GestureDetector中包含很多种对屏幕操作的触发,但是和平常我们设置的点击事件还是有点不同的。或者说GestureDetector是通过平常用的控件实现的。

而平常使用的控件设置的对屏幕的响应,太多了,学习GestureDetector只能做一个较好的开头吧,帮助理解onScroll,onFling这些东西。

好了,以上的话语有些乱,基本写给自己看的,能看懂的就看,看不懂的直接了解GestureDetector吧。


1,大概:

GestureDetector 下有两个监听事件,分别是OnGestureListener 和 OnDoubleTapListener,使用implements

一个类,SimpleOnGestureListener ,使用extends 方式。


2,细节部分请看连接,(太乱,我还是喜欢比较清楚)

http://blog.csdn.net/harvic880925/article/details/39520901


3,直接上源码,注释什么的都在源码里面,(mLog 说明,这是在父类里面实现了一个 log 方法,读者可自行理解成 Log.i("dadada",...))

MainActivity.java

package f21.gestrue;import android.os.Bundle;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.ImageView;import f21.gesture.R;import f21.lib.base.BaseActivity;/** * 按一下: * 轻触 瞬间的事  :onDown onSingleTapUp onSingleTapConfirmed(2) * 触碰 0.5s - 1s :     onDown onShowPress onSingleTapUp onSingleTapConfirmed(2) * 长按 1s 以上  :onDownonShowPressonLongPress *  * 拖动: * 快速滑屏   :onDownonScrollonScroll...onScrollonFling * 按下停顿一下再滑:onDownonShowPressonScroll    ...onScroll结束 *  * 按两下: * 快速两下       :onDownonSingleTapuponDoubleTap(2)OnDoubleTapEvent(2)onDownOnDoubleTapEvent(2) * 缓慢两下  :onDownonSingleTapuponSingleTapConfirmed(2)onDown onSingleTapup onSingleTapConfirmed(2) */public class MainActivity extends BaseActivity {private ImageView iv_gesture;private GestureDetector gestureDetector;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);GestureDetector.OnGestureListener listener = new getstureListener();gestureDetector = new GestureDetector(MainActivity.this, listener);GestureDetector.OnDoubleTapListener listener2 = new getstureListener2();gestureDetector.setOnDoubleTapListener(listener2);iv_gesture = (ImageView) findViewById(R.id.tv_main_gesture);iv_gesture.setFocusable(true);iv_gesture.setClickable(true);iv_gesture.setSelected(true);iv_gesture.setLongClickable(true);/** * 在onTouch()方法中,我们调用GestureDetector的onTouchEvent()方法, * 将捕捉到的MotionEvent交给GestureDetector * 来分析是否有合适的callback函数来处理用户的手势  */iv_gesture.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {return gestureDetector.onTouchEvent(event);}});}/** * 手势监听动作 */private class getstureListener implements GestureDetector.OnGestureListener{/** * 用户按下屏幕就会触发 */@Overridepublic boolean onDown(MotionEvent e) {mLog.i("1 onDown");return false;}/** * 如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行 * 瞬间多长? */@Overridepublic void onShowPress(MotionEvent e) {mLog.i("1 onShowPress");}/** * 一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发, * 当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以也就不会触发这个事件 * 触发顺序: * 点击一下非常快的(不滑动)Touchup: * onDown->onSingleTapUp->onSingleTapConfirmed  * 点击一下稍微慢点的(不滑动)Touchup: * onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed */@Overridepublic boolean onSingleTapUp(MotionEvent e) {mLog.i("1 onSingleTapUp");return false;// 仅执行一次,返回true}/** * 在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法  * 滑屏:手指触动屏幕后,稍微滑动后立即松开 * onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling * 拖动:onDown------》onScroll----》onScroll------》onFiling */@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {mLog.i("1 onScroll");return false;}/** * 长按触摸屏,超过一定时长,就会触发这个事件 * 触发顺序:onDown->onShowPress->onLongPress */@Overridepublic void onLongPress(MotionEvent e) {mLog.i("1 onLongPress");}/** * 滑屏,用户按下触摸屏、快速移动后松开, * 由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发 * e1:第1个ACTION_DOWN MotionEvent * e2:最后一个ACTION_MOVE MotionEvent * velocityX:X轴上的移动速度,像素/秒 * velocityY:Y轴上的移动速度,像素/秒 */@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {mLog.i("1 onFling");return false;}}/** * 双击 */private class getstureListener2 implements GestureDetector.OnDoubleTapListener{@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {mLog.i("2 onSingleTapConfirmed");return false;  // true if the event is consumed, else false}@Overridepublic boolean onDoubleTap(MotionEvent e) {mLog.i("2 onDoubleTap");return false;}@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {mLog.i("2 onDoubleTapEvent");return false;}}/** * SimpleOnGestureListener类本身已经实现了 上两个接口的所有函数,只是里面全是空的 */private class getstureListener3 extends GestureDetector.SimpleOnGestureListener{// 就是上面三个的所有}}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <ImageView        android:id="@+id/tv_main_gesture"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_margin="30dp"        android:background="#ffff0000"/></RelativeLayout>

好了。具体详解,请看连接,里面说的比我细,而且清晰。我只是做一些自己的总结。以及把注释放到自己喜欢看的地方

http://blog.csdn.net/harvic880925/article/details/39520901




0 0
原创粉丝点击