当前位置:   article > 正文

Android开发之手势滑动(滑动手势监听)详解_android手势滑动监听

android手势滑动监听

Android开发之手势滑动(滑动手势监听)详解

 

在Android应用中,经常需要手势滑动操作,比如上下滑动,或左右方向滑动,处理手势滑动通常有两种方法:一种是单独实现setOnTouchListener监听器来,另一种是构建手势探测器

第一种方法,就是在要实现滑动的View中,实现OnTouchListener监听事件,然后判断KeyDonw和KeyUp 直接的位置距离来判断滑动方向,核心实现代码如下:

  1. /** 获取屏幕坐标点 **/
  2. Point startPoint;// 起始点
  3. Point endPoint;// 终点
  4. /** 记录按下的坐标点(起始点)**/
  5. private float mPosX = 0;
  6. private float mPosY = 0;
  7. /** 记录移动后抬起坐标点(终点)**/
  8. private float mCurPosX = 0;
  9. private float mCurPosY = 0;
  10. /**
  11. * 设置上下滑动作监听器
  12. * @author jczmdeveloper
  13. */
  14. private void setGestureListener(){
  15. myView.setOnTouchListener(new OnTouchListener() {
  16. @Override
  17. public boolean onTouch(View v, MotionEvent event) {
  18. // TODO Auto-generated method stub
  19. switch (event.getAction()) {
  20. case MotionEvent.ACTION_DOWN:
  21. mPosX = event.getX();
  22. mPosY = event.getY();
  23. break;
  24. case MotionEvent.ACTION_MOVE:
  25. mCurPosX = event.getX();
  26. mCurPosY = event.getY();
  27. break;
  28. case MotionEvent.ACTION_UP:
  29. if (mCurPosY - mPosY > 0
  30. && (Math.abs(mCurPosY - mPosY) > 25)) {
  31. //向下滑動
  32. } else if (mCurPosY - mPosY < 0
  33. && (Math.abs(mCurPosY - mPosY) > 25)) {
  34. //向上滑动
  35. collapse();
  36. }
  37. break;
  38. }
  39. return true;
  40. }
  41. });
  42. }
第二种方法:就是构建手势探测器,如GestureDetector mygesture = new GestureDetector(this);,然后在onFling方法中根据MotionEvent的两个参数的 按下和滑动以及放开的位置和距离来判断滑动方向以及滑动速度等的。要构建GestureDetector,必须要和OnTouchListener一起使用,因为必须设置Touch监听,核心实现实例如下:
  1. import android.content.Context;
  2. import android.util.AttributeSet;
  3. import android.view.GestureDetector;
  4. import android.view.GestureDetector.OnGestureListener;
  5. import android.view.LayoutInflater;
  6. import android.view.MotionEvent;
  7. import android.view.View;
  8. import android.view.View.OnTouchListener;
  9. import android.view.animation.Animation;
  10. import android.view.animation.AnimationUtils;
  11. import android.widget.FrameLayout;
  12. import android.widget.LinearLayout;
  13. public class TagScrollView extends FrameLayout implements OnTouchListener, OnGestureListener{
  14. private float mPosX, mPosY, mCurPosX, mCurPosY;
  15. private static final int FLING_MIN_DISTANCE = 20;// 移动最小距离
  16. private static final int FLING_MIN_VELOCITY = 200;// 移动最大速度
  17. //构建手势探测器
  18. GestureDetector mygesture = new GestureDetector(this);
  19. public TagScrollView(Context context) {
  20. this(context, null);
  21. }
  22. public TagScrollView(Context context, AttributeSet attrs) {
  23. this(context, attrs, 0);
  24. }
  25. public TagScrollView(Context context, AttributeSet attrs, int defStyle) {
  26. super(context, attrs, defStyle);
  27. //setGestureListener();
  28. //设置Touch监听
  29. this.setOnTouchListener(this);
  30. //允许长按
  31. this.setLongClickable(true);
  32. }
  33. @Override
  34. public boolean onTouch(View v, MotionEvent event) {
  35. // TODO Auto-generated method stub
  36. return mygesture.onTouchEvent(event);
  37. }
  38. @Override
  39. public boolean onDown(MotionEvent e) {
  40. // TODO Auto-generated method stub
  41. return false;
  42. }
  43. @Override
  44. public void onShowPress(MotionEvent e) {
  45. // TODO Auto-generated method stub
  46. }
  47. @Override
  48. public boolean onSingleTapUp(MotionEvent e) {
  49. // TODO Auto-generated method stub
  50. return false;
  51. }
  52. @Override
  53. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
  54. float distanceY) {
  55. // TODO Auto-generated method stub
  56. return false;
  57. }
  58. @Override
  59. public void onLongPress(MotionEvent e) {
  60. // TODO Auto-generated method stub
  61. }
  62. @Override
  63. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
  64. float velocityY) {
  65. // TODO Auto-generated method stub
  66. // e1:第1个ACTION_DOWN MotionEvent
  67. // e2:最后一个ACTION_MOVE MotionEvent
  68. // velocityX:X轴上的移动速度(像素/秒)
  69. // velocityY:Y轴上的移动速度(像素/秒)
  70. // X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/
  71. //
  72. if (e1.getY() - e2.getY() > FLING_MIN_DISTANCE){
  73. // && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
  74. collapse();
  75. }
  76. //向上
  77. if (e2.getY() - e1.getY() > FLING_MIN_DISTANCE
  78. && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
  79. }
  80. return false;
  81. }
  82. }

应用实例如下:

比如对一个ListView进行手势滑动监听的实现如下:

  1. private float mPosX, mPosY, mCurPosX, mCurPosY;//记录mListViewDevice 滑动的位置
  2. private static final int FLING_MIN_DISTANCE = 20;//mListView 滑动最小距离
  3. private static final int FLING_MIN_VELOCITY = 200;//mListView 滑动最大速度
  4. /**
  5. * @author jczmdeveloper
  6. * @desp mListView 的手势监听
  7. */
  8. private OnGestureListener listViewGestureListener = new OnGestureListener() {
  9. @Override
  10. public boolean onSingleTapUp(MotionEvent e) {
  11. // TODO Auto-generated method stub
  12. return false;
  13. }
  14. @Override
  15. public void onShowPress(MotionEvent e) {
  16. // TODO Auto-generated method stub
  17. }
  18. @Override
  19. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
  20. float distanceY) {
  21. // TODO Auto-generated method stub
  22. return false;
  23. }
  24. @Override
  25. public void onLongPress(MotionEvent e) {
  26. // TODO Auto-generated method stub
  27. }
  28. @Override
  29. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
  30. float velocityY) {
  31. // TODO Auto-generated method stub
  32. //向上滑动
  33. if (e1.getY() - e2.getY() > FLING_MIN_DISTANCE) {
  34. // && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
  35. if (mListViewDevice.getLastVisiblePosition() == mListView
  36. .getCount() - 1) {
  37. //do something
  38. }
  39. }
  40. // 向下滑动
  41. if (e2.getY() - e1.getY() > FLING_MIN_DISTANCE
  42. && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
  43. }
  44. return false;
  45. }
  46. @Override
  47. public boolean onDown(MotionEvent e) {
  48. // TODO Auto-generated method stub
  49. return false;
  50. }
  51. };
  52. /**
  53. * @author jczmdeveloper
  54. * @desp mListView 的手势探测器
  55. */
  56. GestureDetector listViewGesture = new GestureDetector(listViewGestureListener);
  57. /**
  58. * @author jczmdeveloper
  59. * @desp mListView 的触摸监听
  60. */
  61. private OnTouchListener listViewOnTouchListener = new OnTouchListener() {
  62. @Override
  63. public boolean onTouch(View v, MotionEvent event) {
  64. // TODO Auto-generated method stub
  65. return listViewDeviceGesture.onTouchEvent(event);
  66. }
  67. };

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/657570
推荐阅读
相关标签
  

闽ICP备14008679号