GestureDetector封装手势检测上下滑动

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

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

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

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

[java] view plaincopy

  1. public abstract class SimpleDetector extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener{
  2. private final GestureDetector mDetector;
  3. private final int mSlop;//slop晃荡的意思
  4. private boolean mIgnore;//是否忽略监听上下滚动
  5. private float mDownY;
  6. public abstract void onScrollDown();
  7. public abstract void onScrollUp();
  8. public SimpleDetector(Context context){
  9. mDetector = new GestureDetector(context,this);
  10. mSlop = getSlop(context);
  11. }
  12. public boolean isIgnore() {
  13. return mIgnore;
  14. }
  15. public void setIgnore(boolean mIgnore) {
  16. this.mIgnore = mIgnore;
  17. }
  18. protected int getSlop(Context context){
  19. if(Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO){
  20. return ViewConfiguration.getTouchSlop() * 2;
  21. }else{
  22. return ViewConfiguration.get(context).getScaledPagingTouchSlop();
  23. }
  24. }
  25. @Override
  26. public boolean onDown(MotionEvent e) {
  27. // TODO Auto-generated method stub
  28. mDownY = e.getY();
  29. return false;
  30. }
  31. @Override
  32. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
  33. float distanceY) {
  34. // TODO Auto-generated method stub
  35. if(mIgnore)
  36. return false;
  37. if(distanceY==0){
  38. mDownY = e2.getY();
  39. }
  40. float distance = mDownY - e2.getY();
  41. if(distance < -mSlop){
  42. onScrollDown();
  43. }else if(distance > mSlop){
  44. onScrollUp();
  45. }
  46. return false;
  47. }
  48. @Override
  49. public boolean onTouch(View v, MotionEvent event) {
  50. // TODO Auto-generated method stub
  51. mDetector.onTouchEvent(event);
  52. return false;
  53. }
  54. }

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

[java] view plaincopy

  1. public class ShowHideOnScroll extends SimpleDetector implements AnimatorListener{
  2. private final View mView;
  3. private int mShowAnimation;
  4. private int mHideAnimation;
  5. private int mTranslationY;
  6. private int curShowHide = 0;
  7. public ShowHideOnScroll(View view,int translationY){
  8. super(view.getContext());
  9. mView = view;
  10. mTranslationY = translationY;
  11. }
  12. public ShowHideOnScroll(View view,int show,int hide,int translationY) {
  13. super(view.getContext());
  14. mView = view;
  15. mShowAnimation = show;
  16. mHideAnimation = hide;
  17. mTranslationY = translationY;
  18. }
  19. @Override
  20. public void onScrollDown() {
  21. mView.setVisibility(View.VISIBLE);
  22. animateShow();
  23. curShowHide = 0;
  24. }
  25. @Override
  26. public void onScrollUp() {
  27. mView.setVisibility(View.VISIBLE);
  28. animateHide();
  29. curShowHide = 1;
  30. }
  31. private void animateShow(){
  32. mView.setTranslationY(mTranslationY);
  33. mView.animate().translationY(0).setInterpolator(new AccelerateDecelerateInterpolator())
  34. .setStartDelay(0).setDuration(400).setListener(ShowHideOnScroll.this).start();
  35. setIgnore(true);
  36. }
  37. private void animateHide(){
  38. mView.setTranslationY(0);
  39. mView.animate().translationY(mTranslationY).setInterpolator(new AccelerateDecelerateInterpolator())
  40. .setStartDelay(0).setDuration(400).setListener(ShowHideOnScroll.this).start();
  41. setIgnore(true);
  42. }
  43. @Override
  44. public void onAnimationStart(Animator animation) {
  45. // TODO Auto-generated method stub
  46. }
  47. @Override
  48. public void onAnimationEnd(Animator animation) {
  49. // TODO Auto-generated method stub
  50. if(curShowHide==0){
  51. mView.setVisibility(View.VISIBLE);
  52. mView.setTranslationY(0);
  53. }else if(curShowHide == 1){
  54. mView.setVisibility(View.INVISIBLE);
  55. mView.setTranslationY(mTranslationY);
  56. }
  57. setIgnore(false);
  58. }
  59. @Override
  60. public void onAnimationCancel(Animator animation) {
  61. // TODO Auto-generated method stub
  62. }
  63. @Override
  64. public void onAnimationRepeat(Animator animation) {
  65. // TODO Auto-generated method stub
  66. }
  67. }
时间: 2024-11-10 23:14:37

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

GestureDetector封装手势检測上下滑动

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

android 判断左右滑动,上下滑动的GestureDetector简单手势检测

直接加入监听GestureDetector放在需要判断滑动手势的地方: 1 import android.app.Activity; 2 import android.os.Bundle; 3 import android.util.Log; 4 import android.view.GestureDetector; 5 import android.view.GestureDetector.OnGestureListener; 6 import android.view.MotionEven

Android使用GestureDetector实现手势滑动效果

直接看实例: package com.example.gesturedetector; import android.os.Bundle; import android.app.Activity; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.Menu; import android.view.MotionEvent;

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

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

9.3、Libgdx手势检测

(官网:www.libgdx.cn) 触摸屏在输入的基础上增加了手势检测,比如两个手指实现缩放,单击或双击屏幕,长按屏幕等. Libgdx提供了GestureDetector来帮助你检测以下手势: touchDown:用户触摸屏幕. longPress:用户长按屏幕. tap:用户点击屏幕.手指必须在点击初始化的位置不能移动太大. pan:用户滑动手指穿过屏幕. panStop:当pan结束时调用. fling:用户滑动手指穿过屏幕,然后释放.通常是用于滑动检测. zoom:用户使用两个手指移动

手势检测(一)

Android为手势检测提供了一个GestureDetector类,GestureDetector实例代表了一个手势检测器,创建GestureDetector时需要传入一个GestureDetector.OnGestureListener实例,其中GestureDetector.OnGestureListener就是一个监听器,负责对用户的手势行为提供响应. 一.API 1.GestureDetector类 (1)功能简介:该类通过使用提供的MotionEvents用于检测各种手势事件,当检测到

Android 手势检测实战 打造支持缩放平移的图片预览效果(下)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图片,简单介绍了下Matrix:具体请参考:Android 手势检测实战 打造支持缩放平移的图片预览效果(上):本篇继续完善我们的ImageView~~ 首先加入放大后的移动~~ 1.自由的进行移动 我们在onTouchEvent里面,加上移动的代码,当然了,必须长或宽大于屏幕才可以移动~~~ @Ov

解决ViewPage中嵌套有ListView或者滑动手势等造成滑动的冲突

public class ViewPagerCompat extends ViewPager { //mViewTouchMode表示ViewPager是否全权控制滑动事件,默认为false,即不控制 private boolean mViewTouchMode = false; public ViewPagerCompat(Context context, AttributeSet attrs) { super(context, attrs); } public void setViewTou

HTML5 手势检测原理和实现

前言 随着 Hybrid 应用的丰富,HTML5 工程师们已经不满足于把桌面端体验简单移植到移动端,他们觊觎移动原生应用人性化的操作体验,特别是原生应用与生俱来的丰富的手势系统.HTML5 没有提供开箱即用的手势系统,但是提供了更底层一些的对 touch 事件的监听.基于此,我们可以做出自己的手势库. 手势 常用的 HTML5 手势可以分为两类,单点手势和两点手势.单点手势有 tap(单击),double tap(双击),long tap(长按),swipe(挥),move(移动).两点手势有