Android 利用事件分发实现滑动Activity返回

/**
* 支持滑动返回
* 继承该Activity则支持滑动返回
* @author 白玉梁
*/
public class SlideBackActivity extends Activity{
     //手指上下滑动时的最小速度
     private static final int YSPEED_MIN = 1000;
     //手指向右滑动时的最小距离
     private static final int XDISTANCE_MIN = 50;
     //手指向上滑或下滑时的最小距离
     private static final int YDISTANCE_MIN = 100;
     //记录手指按下时的横坐标。
     private float xDown;
     //记录手指按下时的纵坐标。
     private float yDown;
     //记录手指移动时的横坐标。
     private float xMove;
     //记录手指移动时的纵坐标。
     private float yMove;
     //用于计算手指滑动的速度。
     private VelocityTracker mVelocityTracker;
     @Override
     public boolean dispatchTouchEvent(MotionEvent event) {
      createVelocityTracker(event);
      switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        xDown = event.getRawX();
        yDown = event.getRawY();
        break;
      case MotionEvent.ACTION_MOVE:
        xMove = event.getRawX();
        yMove= event.getRawY();
        //滑动的距离
        int distanceX = (int) (xMove - xDown);
        int distanceY= (int) (yMove - yDown);
        //获取顺时速度
        int ySpeed = getScrollVelocity();
        //关闭Activity需满足以下条件:
        //1.x轴滑动的距离>XDISTANCE_MIN
        //2.y轴滑动的距离在YDISTANCE_MIN范围内
        //3.y轴上(即上下滑动的速度)<XSPEED_MIN,如果大于,则认为用户意图是在上下滑动而非左滑结束Activity
        if(distanceX > XDISTANCE_MIN &&(distanceY<YDISTANCE_MIN&&distanceY>-YDISTANCE_MIN)&& ySpeed < YSPEED_MIN) {
          finish();
        }
        break;
      case MotionEvent.ACTION_UP:
        recycleVelocityTracker();
        break;
      default:
        break;
      }
      return super.dispatchTouchEvent(event);
    }
    /**
  * 创建VelocityTracker对象,并将触摸界面的滑动事件加入到VelocityTracker当中。
  *
  * @param event
  *
  */
    private void createVelocityTracker(MotionEvent event) {
     if (mVelocityTracker == null) {
        mVelocityTracker = VelocityTracker.obtain();
     }
     mVelocityTracker.addMovement(event);
    }
    /**
  * 回收VelocityTracker对象。
  */
    private void recycleVelocityTracker() {
      mVelocityTracker.recycle();
      mVelocityTracker = null;
    }
    /**
  *
  * [url=home.php?mod=space&uid=309376]@return[/url] 滑动速度,以每秒钟移动了多少像素值为单位。
  */
    private int getScrollVelocity() {
      mVelocityTracker.computeCurrentVelocity(1000);
      int velocity = (int) mVelocityTracker.getYVelocity();
      return Math.abs(velocity);
    }
}

感谢原作者:http://www.apkbus.com/forum.php?mod=viewthread&tid=243621&extra=page%3D2


还有一种开源项目:https : / / github.com / ikew 0 ng / SwipeBackLayout

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值