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当着研究实习生面训了一次。真心不好受。还是提高自己的能力,有时间自己多学习。有能力了不用去苦心证明自己
GestureDetector封装手势检測上下滑动的更多相关文章
- Chromium网页输入事件捕捉和手势检測过程分析
连续的输入事件可能会产生一定的手势操作.比如滑动手势和捏合手势. 在Chromium中,网页的输入事件是在Browser进程中捕捉的.Browser进程捕获输入事件之后,会进行手势操作检測.检測出来的 ...
- 基于QT和OpenCV的人脸检測识别系统(2)
紧接着上一篇博客的讲 第二步是识别部分 人脸识别 把上一阶段检測处理得到的人脸图像与数据库中的已知 人脸进行比对,判定人脸相应的人是谁(此处以白色文本显示). 人脸预处理 如今你已经得到一张人脸,你能 ...
- android 检測右滑的WebView
今天产品出新花样非得要右滑....检測到右滑手势后事件不做处理放在Activity中做对应的处理即可了. import android.app.Activity; import android.con ...
- 手势识别官方教程(2)识别常见手势用GestureDetector+手势回调接口/手势抽象类
简介 GestureDetector识别手势. GestureDetector.OnGestureListener是识别手势后的回调接口.GestureDetector.SimpleOnGesture ...
- 【从零学习openCV】IOS7下的人脸检測
前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app,总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...
- C++内存泄露检測原理
转自:http://hi.baidu.com/jasonlyy/item/9ca0cecf2c8f113a99b4981c 本文针对 linux 下的 C++ 程序的内存泄漏的检測方法及事实上现进行探 ...
- 行人检測之HOG特征(Histograms of Oriented Gradients)
之前的文章行人计数.计次提到HOG特征这个概念,这两天看了一下原版的论文,了解了一下HOG特征的原理,并依据自己的理解将这种方法的流程写了下来,假设有不正确的地方欢迎指正. HOG(Histogram ...
- 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
- Matlab人脸检測方法(Face Parts Detection)具体解释
今天同学让我帮忙制作一个人脸表情识别的样本库,当中主要是对人脸进行裁剪,这里用到了一个相对较新的Matlab人脸检測方法Face Parts Detection.网上百度了一下发现关于Matlab人脸 ...
随机推荐
- Cordova 设置全屏及退出全屏切换
设置全屏在super.init();之前 最后才退出全屏. 以下为具体代码: package com.agile.ittm; import android.os.Bundle; import andr ...
- 李洪强漫谈iOS开发[C语言-028]-sizeof运算符
- Android使用SeekBar时动态显示进度且随SeekBar一起移动
最近有做一个android项目,里面有使用到在播放视频时可以跳播,同时动态显示播放时间.类似于下图 的效果,我只是抽取其中的一部分做展示,刚接到这个事时也是在网上一通找,最后没找到!而且还碰到有些朋友 ...
- 使用ListView时遇到的问题
这周练习ListView时遇到了一个问题,从数据库中查询出的数据绑定到LIstView上,长按某个item进行删除操作,每次点击item取得的id都不对,调了半天终于找到了原因,关键是自己对自定义的B ...
- Win7新建ftp快捷方式(原XP网上邻居中客户端图标)
2014-6-2 XP逐渐隐退,新机器一般都是Win7或者Win8了.有很多朋友反映在这两个新系统中找不到类似XP网上邻居中的ftp链接图标.故稍微研究了下,以Win7为例,总结如下. 1.骨灰级 ...
- 最全的JAVA源码整合下载
http://www.360doc.com/content/14/0602/00/11407612_382890953.shtml http://www.360doc.com/content/14/0 ...
- 利用spm提供的MoAEpilot听觉数据学习预处理以及单被试glm分析与统计推断
1.数据介绍 下载:http://www.fil.ion.ucl.ac.uk/spm/data/auditory/ SUBJECT:1 VOLUME: 64*64*64 TR:7s total acq ...
- Unity3D-基本导航(NavMesh)功能实现
1: 打开场景 2:打开Navgation窗口 菜单中: Window --> Navgation, 在Inspector旁边会出现导航界面 这个Objcet的面板是对应当前选择的物体的,旁边的 ...
- 1057 - Collecting Gold (状态压缩DP)
题目大意: 给你一个矩阵,'x'是你的起始位置, 'g'是宝藏的位置,问最少多少步可以把所有的宝藏取完,并且最后返回起始位置. 注意:没有宝藏的时候输出 0 =================== ...
- 【转】Windows7 下安装 JDK 7 时版本冲突问题解决
原文网址:http://wxl24life.iteye.com/blog/1966058 自己电脑上一直用的 JDK 版本是 1.6,今天决定更新到 1.7,在安装 JDK 1.7 后,控制台输入 j ...