151020_example_GestureDetector详解

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值