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()方法中调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector来处理
最后,还需要实现抽象方法。
实现:
(1)在Activity中创建GestureDetector实例gestureDetector。
(2)可根据需要选择:
重写OnGestureListener并通过构造函数传入gestureDetector
重写OnDoubleTapListener并通过GestureDetector.setOnDoubleTapListener方法传入gestureDetector
重写SimpleOnGestureListener并通过构造函数传入gestureDetector
(3)重写Activity的onTouchEvent方法,将所有的触摸事件交给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一样