Anroid中的事件处理

1. motionEvent

安卓中对于屏幕所有的事件捕捉都封装在motionEvent中

2. Activity间切换有动画执行

overridePendingTransition(“进来的动画”,”出去的动画”)

3. 手势事件gestureDetetor

3.1. gestureDetetor实例demo

1.第一步实例化gesturedetector

mGd = new GestureDetector(newMyOnGestureListener(){

.....这个类还很多的实现方法里只举这个例子,,下面再介绍

   @Override

   publicboolean onFling(MotionEvent e1, MotionEvent e2,floatvelocityX, float velocityY) {                          

      /**

       * e1.x 按下的x方向坐标

       * e2.x  抬起的x方向坐标

       * velocityX  x方向的速率   像素/秒

       * velocityY  y方向的速率   像素/秒

      */

      System.out.println("e1:" +e1.getX() + "  e2:" +e2.getX()  +"  velocityX:" + velocityX + "  velocityY:" + velocityY);

        if(Math.abs(velocityX) > 100){ //x方向速率 > 100像素/秒

         if(e2.getX() - e1.getX() > 0){

            System.out.println("从做向右");

              pre(null);

          }else {

            System.out.println("从右向左");

             next(null);                                   }

          }

            return super.onFling(e1, e2, velocityX,velocityY);

                           }

         });

2.把这个对象手势事件交给onTuochEvent去处理

 把GsetureDetector与onTouchEvent联系上

@Override

publicboolean onTouchEvent(MotionEvent event) {

 If(mGd!=null){

  mGd.onTouchEvent(event);  // 调用ontoch事件

 }

    return true; //自己处理

}

3.2. GestureDetector的介绍

1.封装的组合式event的方法

按下(onDown):刚刚手指接触到触摸屏的那一刹那,就是触的那一下。 
抛掷(onFling):手指在触摸屏上迅速移动,并松开的动作。 
长按(onLongPress):手指按在持续一段时间,并且没有松开。 
滚动(onScroll):手指在触摸屏上滑动。 
按住(onShowPress):手指按在触摸屏上,它的时间范围在按下起效,在长按之前。 
抬起(onSingleTapUp):手指离开触摸屏的那一刹那。 

2.

任何手势动作都会先执行一次按下(onDown)动作。 
长按(onLongPress)动作前一定会执行一次按住(onShowPress)动作。 
按住(onShowPress)动作和按下(onDown)动作之后都会执行一次抬起(onSingleTapUp)动作。 
长按(onLongPress)、滚动(onScroll)和抛掷(onFling)动作之后都不会执行抬起(onSingleTapUp)动作。

3.

一.GestureDetector简介
1.
组成
GestureDetector
类用来识别触摸屏的各种手势,它包含了两个接口和一个内部类:
接口:
OnGestureListener
:用来监听手势事件(6)
OnDoubleTapListener
:用来监听双击事件。
内部类:
SimpleOnGestureListener
:用来监听所有的手势。实际上它实现了上述两个接口,不过方法体是空的,需要我们自己写。我们可以继承这个类,重写里面的方法进行手势处理。
2.
构造
GestureDetector gestureDetector=newGestureDetector(GestureDetector.OnGestureListener listener);
GestureDetector gestureDetector=new GestureDetector(Contextcontext,GestureDetector.OnGestureListener listener);
GestureDetector gestureDetector=new GestureDetector(Contextcontext,GestureDetector.SimpleOnGestureListener listener);
3.
方法
(1)onTouchEvent(MotionEvent ev)
分析捕捉到的触摸事件触发相应的回调函数
(2)setIsLongpressEnabled(boolean isLongpressEnabled)
设置长按是否可用
(3)setOnDoubleTapListener(GestureDetector.OnDoubleTapListeneronDoubleTapListener)
设置双击监听器
4.
使用
流程:
首先,系统捕捉屏幕的触摸事件(onTouchListener),这时还未涉及具体手势,只是简单地捕捉到触摸。
接着,在onTouch()方法中调用GestureDetectoronTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector来处理
最后,还需要实现抽象方法。
实现:
(1)
Activity中创建GestureDetector实例gestureDetector
(2)
可根据需要选择:
重写OnGestureListener并通过构造函数传入gestureDetector
重写OnDoubleTapListener并通过GestureDetector.setOnDoubleTapListener方法传入gestureDetector
重写SimpleOnGestureListener并通过构造函数传入gestureDetector
(3)
重写ActivityonTouchEvent方法,将所有的触摸事件交给gestureDetector来处理
@Override
public boolean onTouchEvent(MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}

4. 事件的传递机制

 1.android的事件响应机制是先走分发方法,再走拦截方法,再走处理方法

  先由最外部的view去接收事件,然后依次去传给其内层的view,再处理从最小的view单元

  然后事件源依次向外层去传递的形式实现的

 2.如果有多个view嵌套,可以用事件是否分必,拦截,或者消费.来完成复杂的触摸事件的处理

 3. 三个重要的方法介绍

  a) dispatchTuochEvent(事件分发)

   return值 :

   false: 本view不处理而且不向下分发,并交给上层view的onTuochEvent去消费

        如果本层已经是activity,那么就会交给系统去处理或消费

   true: 表示由本View去处理消化掉所有的事件不向下分发

   Super: 如果默认走其super的dispatchTouchEvent方法,如果事件将会传到本

  b) onInterceptTouchEvent(事件拦截方法)

    return :

    false: 表示不对事件进行拦截事件会成功分发到子View中并是传给子View的dispatchTouchEvent去处理

    true:  表示拦截事件交给本view的onTuochEvent去处理

    Super: 如果默认走其super的onInterceptTouchEvent方法,和return true一样

 c) onTuchEent(事件处理)

   return值 :

   false: 表示不响应事件,事件会不断的向层view传,直到某个view的OnTuochEvent返回true为止,

        如果所有的view的OnTuochEvent都返加false,那么事件将会交给activity的OnTuochEvent去处理       

   true: 表示消息掉事件,终止事件

   Super: 如果默认走其super的OnTuochEvent方法,和return true一样

猜你喜欢

转载自blog.csdn.net/Lulu_hsu/article/details/66972889