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

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

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

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

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

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

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

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

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

}

Activity简单几步支持向右滑动返回的更多相关文章

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

    向右滑动返回,对于屏幕过大的手机来说,在单手操作时,是一个不错的用户体验,用户不必再费力的或者用另一个手去点击屏幕左上角的返回按钮或者,手机右下角的返回按钮,轻轻向右滑动屏幕即可返回上一页,这个功能如 ...

  2. css3简单几步画一个乾坤图

    原文:[原创]css3简单几步画一个乾坤图 效果如上,鼠标移上去会有动画. 代码如下非常简单: <html> <head> <style> .outer{heigh ...

  3. Android之Activity系列总结(二)--任务和返回栈

    任务和返回栈 应用通常包含多个 Activity.每个 Activity 均应围绕用户可以执行的特定操作设计,并且能够启动其他 Activity. 例如,电子邮件应用可能有一个 Activity 显示 ...

  4. golang函数——可以为类型(包括内置数据类型)定义函数,类似类方法,同时支持多返回值

    不可或缺的函数,在Go中定义函数的方式如下: func (p myType ) funcName ( a, b int , c string ) ( r , s int ) { return } 通过 ...

  5. jquery ajax中支持哪些返回类型以及js中判断一个类型常用的方法?

    1 jquery ajax中支持哪些返回类型在JQuery中,AJAX有三种实现方式:$.ajax() , $.post , $.get(). 预期服务器返回的数据类型.如果不指定,jQuery 将自 ...

  6. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

  7. 支持多返回值存储过程的SqlHelper

    public readonly string connStr = ConfigurationManager.ConnectionStrings["sql"].ConnectionS ...

  8. 简单几步配置gitlab

    简单几步配置gitlab 之前配置gitlab需要很多步骤,要装apache2.ruby.tomcat.mysql等一片东西.有没有更简单的方式呢?现在可以借助bitnami,简化了很多. 可以参考v ...

  9. 【转】简单十步让你全面理解SQL

    简单十步让你全面理解SQL 很多程序员认为SQL是一头难以驯服的野兽.它是为数不多的声明性语言之一,也因为这样,其展示了完全不同于其他的表现形式.命令式语言. 面向对象语言甚至函数式编程语言(虽然有些 ...

随机推荐

  1. 51Nod 1530 稳定方块

    瓦西亚和皮台亚摆放了m个方块.方块被编号为0到m-1(每个号码出现恰好一次).现在建立一个座标系OX表示地面,OY的方向是竖直向上的.每一方块的左下角有一个座标而且是整点座标. 摆放好的方块一定要是稳 ...

  2. [USACO Jan09] 安全路径

    Gremlins最近在农场上泛滥,它们经常会阻止牛们从农庄(牛棚_1)走到别的牛棚(牛_i的目的 地是牛棚_i).每一个gremlin只认识牛_i并且知道牛_i一般走到牛棚_i的最短路经.所以它 们在 ...

  3. python 2week

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 1 names =  ...

  4. Python中byte与str

    原文传送门:请点击 现在计算机中,在内存中采用unicode编码方式. 可以看到上图中,字节型数据t并没有像想象中的一样显示0,1字符串.显示仍然是b,这是因为t是采用utf-8来编码,而utf-8与 ...

  5. K-means聚类 的 Python 实现

    K-means聚类 的 Python 实现 K-means聚类是一个聚类算法用来将 n 个点分成 k 个集群. 算法有3步: 1.初始化– K 个初始质心会被随机生成 2.分配 – K 集群通过关联到 ...

  6. [ 学习笔记 ] Hibernate框架学习之一

    一.JavaEE开发三层结构和三大框架的对应关系: Struts2框架 -> 表现层 web层(MVC是表现层的设计模型) 业务层 service层 Hibernate框架 -> 持久层 ...

  7. android基础-界面开发注意事项

    做安卓开发时一定要注意,主线程不能更改UI界面,如果出现程序运行时崩溃的情况,如果没有明显的语法错误,请检查自己的进程是否出现冲突,崩溃.如果有与后台的连接,即请求向服务器发送请求的时尤其需要注意,或 ...

  8. iOS Push详述,了解一下?

    WeTest 导读 本文主要对iOS Push的在线push.本地push及离线(远程)push进行梳理,介绍了相关逻辑,测试时要注意的要点以及相关工具.小小的Push背后蕴藏着大大的逻辑! Push ...

  9. 嫌我的键盘的backspace太小,就尝试了一下改键工具--keyTweak

    KeyTweak是一个很简单的键盘remap小工具,主要功能就是可以让我们选择某个按键并重新赋予该按键一个新的功能.如果哪天你的键盘某个重要的键坏掉了,可以通过这个免费的软件来重新定义该按键的功能.譬 ...

  10. MongoDB Java

    MongoDB Java 环境配置 在Java程序中如果要使用MongoDB,你需要确保已经安装了Java环境及MongoDB JDBC 驱动. 你可以参考本站的Java教程来安装Java程序.现在让 ...