Activity简单几步支持向右滑动返回
向右滑动返回,对于屏幕过大的手机来说,在单手操作时,是一个不错的用户体验,用户不必再费力的或者用另一个手去点击屏幕左上角的返回按钮或者,手机右下角的返回按钮,轻轻向右滑动屏幕即可返回上一页,这个功能如今大部分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,如果大于,则认为用户意图是在上下滑动而非左滑结束Activityif(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简单几步支持向右滑动返回相关推荐
- Android Activity向右滑动返回
欢迎加入技术谈论群:714476794 向右滑动返回,对于屏幕过大的手机来说,在单手操作时,是一个不错的用户体验,用户不必再费力的或者用另一个手去点击屏幕左上角的返回按钮或者,手机右下角的返 ...
- mysql插入数据返回主键值_Mysql千万级别数据批量插入只需简单三步!
第一步:配置my.ini文件 文件中配置 bulk_insert_buffer_size=120M 或者更大 将insert语句的长度设为最大. Max_allowed_packet=1M Net_b ...
- android实现向右滑动返回功能
在ios7中,苹果的原生态应用几乎都能够通过向右滑动来返回到前一个页面,这样可以避免用户在单手操作时用大拇指去点击那个遥远的返回键(iphone5的这种返回被吐糟为反人类设计).然而现在android ...
- “果粉”速递:简单9步轻松绕过iCloud 激活锁
本文讲的是"果粉"速递:简单9步轻松绕过iCloud 激活锁,如何在iPhone 7(Plus).6S Plus.6S.6 Plus.6.5S.5C.4S.4以及iPad或iPod ...
- iphone微信 电脑连接到服务器,简单几步,让 iPhone 无线访问 Windows 传文件
原标题:简单几步,让 iPhone 无线访问 Windows 传文件 曾经有句话是这么说的:世界上最遥远的距离,不是生与死,是我的手机是 iPhone,而电脑却是 Windows. 如果你使用的是苹果 ...
- 手机改小视窗什么意思_简单几步教你如何将手机投屏到电视,1秒小屏变大屏!...
原标题:简单几步教你如何将手机投屏到电视,1秒小屏变大屏! Hi,大家好,我是小雨!最近有人在后台咨询小雨,怎样将手机画面投屏到电视上,让手机的小屏变大屏.今天小雨就来和大家一起聊一聊这个问题,简单几 ...
- 移动信号4g显示无服务器,手机没信号?4G变成E?简单几步,轻松搞定!
原标题:手机没信号?4G变成"E"?简单几步,轻松搞定! 随着市面上各种手机信号放大器的普及和人们对手机信号放大器知识的认知提升,近年来手机信号放大器市场可谓十分火爆,各家各户都基 ...
- [转]简单几步成为微信公众平台开发者 - 杨栋
简单几步成为微信公众平台开发者 - 杨栋 时间 2013-09-29 16:36:00 博客园-原创精华区原文 http://www.cnblogs.com/yangdong/p/3345890. ...
- golang函数——可以为类型(包括内置数据类型)定义函数,类似类方法,同时支持多返回值...
不可或缺的函数,在Go中定义函数的方式如下: func (p myType ) funcName ( a, b int , c string ) ( r , s int ) {return } 通过函 ...
最新文章
- Marathon 0.15: 更稳定 更多数据 更易用
- php信息采集开发,程序php信息采集程序代码
- plsql清完表需不需要提交事务_分布式基础-分布式事务
- broker可以禁用吗 time_Win8.1系统Runtime Broker是什么进程?可以禁用吗?
- python变量类型声明_python变量声明及简单数据类型
- 文件另存为GBK编码格式
- 微分方程Gear方法MATLAB,matlab求解常微分方程(组)
- The type of the expression must be an array type but it resolved to ListObj
- 7-13 统计工龄 (20分)
- 服务器 异常自动关机,服务器自动关机常见问题
- Angel 相关学习
- 设计模式 ---建造者模式
- MySQL 怎么插入10天前的日期_使用 MySQL 的 SQL_MODE 有哪些坑,你知道么?
- win10家庭版用户实现远程桌面解决办法
- 《unix环境高级编程》--- 终端I/O
- 长安大学微型计算机原理与接口技术答案,长安大学微机原理与接口技术B卷答案...
- 最少拍无纹波计算机控制系统,最少拍无纹波计算机控制系统设计.doc
- A Survey on Deep Learning in Medical Image Analysis
- WIN10宽带连接秒断解决办法
- TensorFlow实战系列11--卷积层网络结构
热门文章
- 包装设计实战案例教学
- ehvierwer登录与不登录_【虎嗅早报】抖音回应无法用微信账号登录:不清楚是否为人为...
- OpenCV學習筆記(6)基於 VC+OpenCV+DirectShow 的多個攝像頭同步工作
- python html 补全标签_补充:HTML标签和CSS
- 湖北武汉电信机房详细介绍
- //苏嵌//张朋//2018.07.11
- CMD专业 :taskkill :::强制结束各种进程---查询端口号及占用端口号等
- 机器人编程学的是什么
- 本地JAVA开发页面使用AzureAD(AAD)验证登录
- 设计自制编程语言Monkey编译器:使用普拉特解析法解析复杂的算术表达式