啰嗦几句,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 以上 : onDown onShowPress onLongPress
*
* 拖动:
* 快速滑屏 : onDown onScroll onScroll ... onScroll onFling
* 按下停顿一下再滑: onDown onShowPress onScroll ... onScroll 结束
*
* 按两下:
* 快速两下 : onDown onSingleTapup onDoubleTap(2) OnDoubleTapEvent(2) onDown OnDoubleTapEvent(2)
* 缓慢两下 : onDown onSingleTapup onSingleTapConfirmed(2) onDown onSingleTapup onSingleTapConfirmed(2)
*/
public class MainActivity extends BaseActivity {
private ImageView iv_gesture;
private GestureDetector gestureDetector;
@Override
protected 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() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});
}
/**
* 手势监听动作
*/
private class getstureListener implements GestureDetector.OnGestureListener{
/**
* 用户按下屏幕就会触发
*/
@Override
public boolean onDown(MotionEvent e) {
mLog.i("1 onDown");
return false;
}
/**
* 如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行
* 瞬间多长?
*/
@Override
public void onShowPress(MotionEvent e) {
mLog.i("1 onShowPress");
}
/**
* 一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发,
* 当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以也就不会触发这个事件
* 触发顺序:
* 点击一下非常快的(不滑动)Touchup:
* onDown->onSingleTapUp->onSingleTapConfirmed
* 点击一下稍微慢点的(不滑动)Touchup:
* onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
*/
@Override
public boolean onSingleTapUp(MotionEvent e) {
mLog.i("1 onSingleTapUp");
return false; // 仅执行一次,返回true
}
/**
* 在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法
* 滑屏:手指触动屏幕后,稍微滑动后立即松开
* onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
* 拖动:onDown------》onScroll----》onScroll------》onFiling
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
mLog.i("1 onScroll");
return false;
}
/**
* 长按触摸屏,超过一定时长,就会触发这个事件
* 触发顺序:onDown->onShowPress->onLongPress
*/
@Override
public 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轴上的移动速度,像素/秒
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
mLog.i("1 onFling");
return false;
}
}
/**
* 双击
*/
private class getstureListener2 implements GestureDetector.OnDoubleTapListener{
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
mLog.i("2 onSingleTapConfirmed");
return false; // true if the event is consumed, else false
}
@Override
public boolean onDoubleTap(MotionEvent e) {
mLog.i("2 onDoubleTap");
return false;
}
@Override
public 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