项目中须要检測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当着研究实习生面训了一次。真心不好受。还是提高自己的能力,有时间自己多学习。有能力了不用去苦心证明自己

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

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

    连续的输入事件可能会产生一定的手势操作.比如滑动手势和捏合手势. 在Chromium中,网页的输入事件是在Browser进程中捕捉的.Browser进程捕获输入事件之后,会进行手势操作检測.检測出来的 ...

  2. 基于QT和OpenCV的人脸检測识别系统(2)

    紧接着上一篇博客的讲 第二步是识别部分 人脸识别 把上一阶段检測处理得到的人脸图像与数据库中的已知 人脸进行比对,判定人脸相应的人是谁(此处以白色文本显示). 人脸预处理 如今你已经得到一张人脸,你能 ...

  3. android 检測右滑的WebView

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

  4. 手势识别官方教程(2)识别常见手势用GestureDetector+手势回调接口/手势抽象类

    简介 GestureDetector识别手势. GestureDetector.OnGestureListener是识别手势后的回调接口.GestureDetector.SimpleOnGesture ...

  5. 【从零学习openCV】IOS7下的人脸检測

    前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app,总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...

  6. C++内存泄露检測原理

    转自:http://hi.baidu.com/jasonlyy/item/9ca0cecf2c8f113a99b4981c 本文针对 linux 下的 C++ 程序的内存泄漏的检測方法及事实上现进行探 ...

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

    之前的文章行人计数.计次提到HOG特征这个概念,这两天看了一下原版的论文,了解了一下HOG特征的原理,并依据自己的理解将这种方法的流程写了下来,假设有不正确的地方欢迎指正. HOG(Histogram ...

  8. 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

  9. Matlab人脸检測方法(Face Parts Detection)具体解释

    今天同学让我帮忙制作一个人脸表情识别的样本库,当中主要是对人脸进行裁剪,这里用到了一个相对较新的Matlab人脸检測方法Face Parts Detection.网上百度了一下发现关于Matlab人脸 ...

随机推荐

  1. 【C语言】中的布尔类型

    C语言中的布尔类型 一.相关基础知识 首先bool  true  false为C++中的关键字,C语言中默认不支持这几个字符! 二.具体内容 在C89 (ANSI C)标准中没有定义与布尔类型相关的内 ...

  2. Linux发行版

    Linux 发行版(英语:Linux distribution,也被叫做GNU/Linux 发行版),为一般用户预先集成好的Linux操作系统及各种应用软件.一般用户不需要重新编译,在直接安装之后,只 ...

  3. Web-Scale IT:对企业的影响

    本文翻译自文章Web-Scale IT: The Enterprise Impact. 作者Brendan Ziolo 在通信.网络和安全行业有着近20年的经验,在 Sipera Systems,Ce ...

  4. 【HDU 4276】The Ghost Blows Light(树形DP,依赖背包)

    The Ghost Blows Light Problem Description My name is Hu Bayi, robing an ancient tomb in Tibet. The t ...

  5. linux和windows双系统导致的时间日

    我的博客:www.while0.com系统中有两种时间区分,一为UTC,另一为LT(地方时)两者的区别为时区不同,UTC就是0时区的时间,而我们当地是用的北京时间要慢8小时.linux采用的UTC时间 ...

  6. 你们都是怎么阅读android系统源码的,用什么工具?

    如果是eclipse,可以建立java或者c++工程,把framework源码导入.packages目录下的可以建立android工程.sourceinsight的话,建立工程把相应模块的代码添加进去 ...

  7. PLSQL调用webservice

      1.   用途简介 为什么要在Oracle中访问WebService?在系统实现中,有时会有直接在数据库端利用触发器.存储过程等方式进行数据传递.分发的业务,而其中可能会涉及一些业务逻辑,为了处理 ...

  8. JVM Monitoring: JMX or SNMP?

    JVM Monitoring: JMX or SNMP? By daniel on Feb 23, 2007 Since JavaTM SE 5.0, the JRE provides a means ...

  9. WordPress MORE+主题‘prettyPhoto’跨站脚本漏洞

    漏洞名称: WordPress MORE+主题‘prettyPhoto’跨站脚本漏洞 CNNVD编号: CNNVD-201310-284 发布时间: 2013-10-23 更新时间: 2013-10- ...

  10. windows下 破解 Sublime Text3 和汉化

    这货已经出到3了. windows下载,破解,使用方法: 一:破解 1: 去官网下载最新版本 http://www.sublimetext.com/3 2:下载破解器(SublimeTextKeyge ...