两步搞定Activity的向右滑动返回的功能

向右滑动返回,对于屏幕过大的手机来说,在单手操作时,是一个不错的用户体验,用户不必再费力的或者用另一个手去点击屏幕左上角的返回按钮或者,手机右下角的返回按钮,轻轻向右滑动屏幕即可返回上一页,这个功能如今大部分APP都已经支持啦,你的APP支持了吗?

自己在网上百度了一些滑动返回的方法,有的是用的第三方控件如swipebackLayout但弊端过大如与自己自定义的一些控件冲突等,有的是通 过判断手势监听但步骤相当繁琐,总之没有尽如人意的,本篇所讲的实现方法其实也是通过监听事件分发来实现的,但是步骤非常简单,且效果经本人不断测试也相 当不错,接下来本人讲解下实现过程:

实现该功能需同时满足几个条件,并要考虑用户的操作意图,既要保证足够的灵敏度,不要出现向右滑动好多次还没返回上一页的情况,也不要出现本来是想上下滑动(斜着上下滑动)而非向右滑动返回,也被判断为向右滑动返回而结束了当前界面,那么我们需要满足:

1.用户需向右滑动一段距离,且X轴距离>某一设定的值;

2.因为向右滑动时,不可能时严格的水平方向而不向Y轴偏移,所以向Y轴的偏移量不能超过某一设定的值,否则认为用户意图不是滑动返回而是上下滑动;

3.在测试过程中,如果用户意图是上下滑动时,那么手指在y轴移动速度(我们按每秒移动的像素值,可通过VelocityTracker类计算)非 常大,通常在几千到过万,而在正常的水平滑动时,y轴的移动速度通常只有100左右,因此,我们需要判断的是,如果y轴上手指滑动速度超过某一设定值(本 人将该值设置为了1000),则认为用户意图是上下滑动而非向右滑动返回;

好了,接下来我们便可自定义一个SlideBackActivity继承Activity,并在SlideBackActivity中重写事件分发dispatchTouchEvent,并记录手指按下,移动的距离及手指滑动速度,从而判断用户的意图,完整代码:

/**
* 支持滑动返回
* 继承该Activity则支持滑动返回
*/
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;
    }

    /**
      *
      * @return 滑动速度,以每秒钟移动了多少像素值为单位。
      */
    private int getScrollVelocity() {
          mVelocityTracker.computeCurrentVelocity(1000);
          int velocity = (int) mVelocityTracker.getYVelocity();
          return Math.abs(velocity);
    }

}

接下来的两步可以很容易的将这个功能加入你的APP:

第一步:创建一个class类名为SlideBackActivity,并将以上代码复制粘贴进去。

第二部:将你APP需要向右滑动返回的页面所在activity继承改为SlideBackActivity,即可实现。

转载出处:Android开发中文站 » Activity简单几步支持向右滑动返回

时间: 2024-10-07 07:55:22

两步搞定Activity的向右滑动返回的功能的相关文章

【路由达人】简单两步搞定小米路由新增功能-DDNS(解析域名地址转向在线工具)

DDNS(Dynamic Domain Name Server)是动态域名服务的缩写! 简单来说目前ISP大多为我们提供动态IP(如ADSL拨号上网),而很多设备或服务需要通过远程访问时需要一个固定的IP,而固定IP的费用很难让客户接受.所以DDNS它可以捕获用户每次变化的IP,然后将其与域名相对应,这样客户就可以直接通过域名来进行远程访问了. 简而言之:让你在外网使用域名方式访问家里的网络 DDNS解析过程演示图 <ignore_js_op> 内置运营商 花生壳oray.com 公云3322

SmaterWeatherApi---签名加密和数据访问--简单粗暴一步搞定

使用中国天气网接口的朋友们,大家(还有我)辛苦了 有兴趣的可以去了解一下http://smart.weather.com.cn/wzfw/smart/weatherapi.shtml 年初的时候停用了之前的接口,改为申请使用,于是发个了申请邮件,中间各种曲折...一万字.. 总算是申请下来了,不过接口文档啊,看的我累觉不爱,文档上只有php版的kay生成方法,我在androi上使用,那些加密方法不知道用java如何实现 一怒之下,就写个php版的吧,本来是只想写个生成key的接口的,后来想了想

iOS开发三步搞定百度推送

iOS开发三步搞定百度推送 百度推送很简单,准备工作:在百度云推送平台注册应用,上传证书. 步骤一: 百度云推送平台 http://push.baidu.com/sdk/push_client_sdk_for_ios  在这里下载iOS端SDK包,如下图: 把SDK包里面的下图文件夹拖到你的工程中,如下图,第一步就这么简单. 步骤二: 在工程中AppDelegate.m中的- (BOOL)application:(UIApplication *)application didFinishLaun

10步搞定App内测发布(蒲公英内测平台)

10步搞定App内测发布(蒲公英内测平台) (写作不易,转载请注明出处,谢谢!) App内测是必不可少的一个环节,重中之重! 有两种方法:一.把每台手机的插到开发人员的电脑上跑一边(不推荐):二.通过第三方分发平台(推荐),可以把自己的App发布到第三方的平台上,供内部员工下载,就不需要每台机子都到开发人员的电脑上跑一遍! 现在博主(最近看博客,博主都这样称呼自己)就来谈谈第二种方式,平台使用蒲公英平台: 1.开发者账号,Must: 2.要测试的iPhone.iPad真机的UDID填写到Deve

redha7.2配置静态网卡(三步搞定)

三步搞定: 编辑网卡配置文件:vi /etc/sysconfig/network-scripts/ifcfg-eno16777736(也可能是eth0或eth1或者eth+任何数字) 当前是DHCP,如果要使用静态IP修改: BOOTPROTO=static                #声明IP地址获得的途径 ONBOOT=yes                          #开启自动启用网络连接 增加: IPADDR=192.168.1.1              #设置IP地址(

四步搞定NiosII工程路径改变(转)

四步搞定NiosII工程路径改变 (2014-08-03 16:41:01) 转载▼http://blog.sina.com.cn/s/blog_bff0927b0102uy30.html 标签: nios 路径改变 setting.bsp 分类: 开发工具 在NiosII的开发过程中,路径改变会带来一系列问题:比如当我们在PC上某个路径下新建一个工程Nios_Prj(含QuartusII工程.Qsys模块和NiosII工程)后,假设其路径为C:\Nios_Prj,如果将工程路径改为D:\Nio

教你破解网页上各种限制(禁止鼠标右击复制等等)一步搞定!

有的网页防止别人直接复制盗取网页内容,设置了复制限制韩国的一些博客网站经常有这样的限制~现在我来教大家怎么用一步破解,不需要在浏览器里设置,一步搞定(博主建议:复制他人内容请注明来源,尊重他们劳动成果!) 来源: http://www.harleygwak.com/日志/教你破解网页上各种限制(禁止鼠标右击复制等等/方法:只要在浏览器地址栏输入以下内容就可以了. javascript:alert(document.onselectstart = document.onbeforecopy = d

西班牙充气教堂助你闪婚 两小时“搞定”婚礼(图)

充气教堂. 对国外的闪婚族而言,结婚时订不到教堂是个难题.侨居西班牙的英国商人迈克尔·吉尔发明可供出租的充气教堂,两小时"搞定"婚礼. 充气教堂充满气后高3.66米.内部长3.66米,最多可容纳60名来宾.别看是个充气教堂,它可谓"五脏俱全",有一般教堂象征的钟楼尖顶.花玻璃窗以及管风琴.长木凳.圣坛等. 教堂充气需要两小时,但30分钟就能把空气完全放掉,每次租借费用为2.5万英镑(约合4.2万美元). 吉尔现年45岁,在西班牙经营"极限充气"公

android4步搞定自定义dialog

第一步,drawable新建一个圆角的背景xml dialog.xml <?xml version="1.0" encoding="utf-8"?> <!-- 用户注册红色按钮 --> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"><!-- andr