151020_example_GestureDetector详解

来源:互联网 时间:1970-01-01

啰嗦几句,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





相关阅读:
Top