GestureDetector封装手势检測上下滑动

项目中须要检測ListView的上滑下滑隐藏顶部View控件,之前在网上也有非常多实现案例。在git上发现个封装非常不错的样例,记录下来。

GestureDetector是一个手势检測类,内部有个SimpleOnGestureListener手势监听类。

定义一个抽象类SimpleDetector。继承GestureDetector.SimpleOnGestureListener抽象类,实现View.OnTouchListener接口。这样做有什么优点呢?首先ListView仅仅要setOnTouchListener。把定义的这个抽象类SimpleDetector设置进就好。然后这个类SimpleDetector仅仅须要负责检測上滑还是下滑事件。逻辑得到了分离。

为了要实现ListView顶部View控件的动画效果,须要定义另外一个类继承上面抽象的SimpleDetector类,在这个类里单独处理上滑下滑时候须要运行的动画或者其他逻辑事件。上面的SimpleDetector抽象类提供两个抽象方法供子类去实现。这样整个封装就显得很完美了。

public abstract class SimpleDetector extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener{

	private final GestureDetector mDetector;
	private final int mSlop;//slop晃荡的意思
	private boolean mIgnore;//是否忽略监听上下滚动
	private float mDownY;

	public abstract void onScrollDown();
	public abstract void onScrollUp();

	public SimpleDetector(Context context){
		mDetector = new GestureDetector(context,this);
		mSlop = getSlop(context);
	}

	public boolean isIgnore() {
		return mIgnore;
	}
	public void setIgnore(boolean mIgnore) {
		this.mIgnore = mIgnore;
	}
	protected int getSlop(Context context){
		if(Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO){
			return ViewConfiguration.getTouchSlop() * 2;
		}else{
			return ViewConfiguration.get(context).getScaledPagingTouchSlop();
		}
	}

	@Override
	public boolean onDown(MotionEvent e) {
		// TODO Auto-generated method stub
		mDownY = e.getY();
		return false;
	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		if(mIgnore)
			return false;
		if(distanceY==0){
			mDownY = e2.getY();
		}

		float distance = mDownY - e2.getY();

		if(distance < -mSlop){
			onScrollDown();
		}else if(distance > mSlop){
			onScrollUp();
		}
		return false;
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		mDetector.onTouchEvent(event);
		return false;
	}

}

处理动画显示隐藏事件逻辑处理类

public class ShowHideOnScroll extends SimpleDetector implements AnimatorListener{

	private final View mView;
	private int mShowAnimation;
	private int mHideAnimation;
	private int mTranslationY;
	private int curShowHide = 0;

	public ShowHideOnScroll(View view,int translationY){
		super(view.getContext());
		mView = view;
		mTranslationY = translationY;
	}

	public ShowHideOnScroll(View view,int show,int hide,int translationY) {
		super(view.getContext());
		mView = view;
		mShowAnimation = show;
		mHideAnimation = hide;
		mTranslationY = translationY;
	}

	@Override
	public void onScrollDown() {
		mView.setVisibility(View.VISIBLE);
		animateShow();
		curShowHide = 0;
	}

	@Override
	public void onScrollUp() {
		mView.setVisibility(View.VISIBLE);
		animateHide();
		curShowHide = 1;
	}
	private void animateShow(){
		mView.setTranslationY(mTranslationY);
		mView.animate().translationY(0).setInterpolator(new AccelerateDecelerateInterpolator())
		.setStartDelay(0).setDuration(400).setListener(ShowHideOnScroll.this).start();
		setIgnore(true);
	}
	private void animateHide(){
		mView.setTranslationY(0);
		mView.animate().translationY(mTranslationY).setInterpolator(new AccelerateDecelerateInterpolator())
		.setStartDelay(0).setDuration(400).setListener(ShowHideOnScroll.this).start();
		setIgnore(true);
	}

	@Override
	public void onAnimationStart(Animator animation) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onAnimationEnd(Animator animation) {
		// TODO Auto-generated method stub
		if(curShowHide==0){
			mView.setVisibility(View.VISIBLE);
			mView.setTranslationY(0);
		}else if(curShowHide == 1){
			mView.setVisibility(View.INVISIBLE);
			mView.setTranslationY(mTranslationY);
		}
		setIgnore(false);
	}

	@Override
	public void onAnimationCancel(Animator animation) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onAnimationRepeat(Animator animation) {
		// TODO Auto-generated method stub

	}

}

好了。上面两个类的封装非常easy。但却非常完美,每一个事件的逻辑处理分离了。ListView之类的控件仅仅须要把自己的touchlistener事件传递进去就能够了。

这个能够举一反三运用到其他地方去,以后写代码框架非常重要。事物逻辑要做到分离。这样代码写的非常完美无可挑剔。

在新公司上了一个多月班了。压力山大,全是高材生,研究生也来写代码,真心的~然后又被boss当着研究实习生面训了一次。真心不好受。还是提高自己的能力,有时间自己多学习。有能力了不用去苦心证明自己

时间: 2024-08-24 02:50:10

GestureDetector封装手势检測上下滑动的相关文章

Chromium网页输入事件捕捉和手势检測过程分析

连续的输入事件可能会产生一定的手势操作.比如滑动手势和捏合手势. 在Chromium中,网页的输入事件是在Browser进程中捕捉的.Browser进程捕获输入事件之后,会进行手势操作检測.检測出来的手势操作将会发送给Render进程处理,由于它们须要应用在网页之上.与此同一时候.Browser进程也会将原始的输入事件发送给Render进程处理.本文接下来就分析Browser进程处理网页输入事件的过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! <A

GestureDetector封装手势检测上下滑动

项目中需要检测ListView的上滑下滑隐藏顶部View控件,之前在网上也有很多实现案例.在git上发现个封装很不错的例子,记录下来. GestureDetector是一个手势检测类,内部有个SimpleOnGestureListener手势监听类. 定义一个抽象类SimpleDetector,继承GestureDetector.SimpleOnGestureListener抽象类,实现View.OnTouchListener接口.这样做有什么好处呢?首先ListView只要setOnTouch

android 检測右滑的WebView

今天产品出新花样非得要右滑....检測到右滑手势后事件不做处理放在Activity中做对应的处理即可了. import android.app.Activity; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import

行人检測之HOG特征(Histograms of Oriented Gradients)

之前的文章行人计数.计次提到HOG特征这个概念,这两天看了一下原版的论文,了解了一下HOG特征的原理,并依据自己的理解将这种方法的流程写了下来,假设有不正确的地方欢迎指正. HOG(Histograms of Oriented Gradients)特征的基本思想:The basic idea is that local object appearance and shape can often be characterized rather well by the distribution of

Cocos2d-x 3.0中 物理碰撞检測中onContactBegin回调函数不响应问题

好吧,事实上这篇也是暂时冒出来的,近期朋友要做个物理游戏,曾经做物理还是用box2d,呃.确实要花些功夫才干搞懂当中的精髓,可是听讲这套引擎又一次封装了一次.要easy非常多,所以就简单尝试了一下,感觉确实要简单不少,只是在这当中还是遇到了些问题,首先就来说说onContactBegin这个回调函数响应问题. 先说说情况.简单做了一个打砖块的游戏.前面一切都非常顺利,仅仅是做到碰撞检測的时候,发现回调函数弄死都不调用.開始我以为函数写错了,后来查了api.testCpp都没有错,在3.0的api

C++内存泄露检測原理

转自:http://hi.baidu.com/jasonlyy/item/9ca0cecf2c8f113a99b4981c 本文针对 linux 下的 C++ 程序的内存泄漏的检測方法及事实上现进行探讨.当中包含 C++ 中的 new 和 delete 的基本原理,内 存检測子系统的实现原理和详细方法,以及内存泄漏检測的高级话题.作为内存检測子系统实现的一部分,提供了一个具有更好的使用特性的相互排斥体 (Mutex)类. 1.开发背景 在 windows 下使用 VC 编程时,我们通常须要 DE

OpenCV图像处理篇之边缘检測算子

3种边缘检測算子 灰度或结构等信息的突变位置是图像的边缘,图像的边缘有幅度和方向属性.沿边缘方向像素变化缓慢,垂直边缘方向像素变化剧烈.因此,边缘上的变化能通过梯度计算出来. 一阶导数的梯度算子 对于二维的图像.梯度定义为一个向量. Gx对于x方向的梯度,Gy相应y方向的梯度,向量的幅值本来是 mag(f)?=?(Gx2?+?Gy2)1/2,为简化计算,一般用mag(f)=|Gx|+|Gy|近似,幅值同一时候包括了x而后y方向的梯度信息.梯度的方向为 α?=?arctan(Gx/Gy) . 因为

LeakCanary:简单粗暴的内存泄漏检測工具

差点儿每一个程序猿在开发的过程中都会遇到内存泄漏.那么我们怎样检測到app是否哪里出现内存泄漏呢?square公司推出了一款简单粗暴的检測内存泄漏的工具-- LeakCanary 什么是内存泄漏? 内存泄漏是指因为疏忽或者错误造成程序未能释放已经不再使用的内存,内存泄漏不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误失去了对于这段内存的控制.因而造成内存的浪费. 内存泄漏和内存溢出是两码事,不要混淆,内存溢出通俗的讲就是内存不够用,如今的仅仅能手机内存越来越大,内存溢出的情况不

ASP怎样检測某目录是否存在,不存在则自己主动创建

ASP怎样检測某目录是否存在,不存在则自己主动创建 folder=server.mappath("/imagess") Set fso = CreateObject("Scripting.FileSystemObject") if fso.fileexists(Server.mappath(filepath)) then respnse.write("都有了还建什么建") else fso.createfolder(folder) end if