博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Activity简单几步支持向右滑动返回
阅读量:6272 次
发布时间:2019-06-22

本文共 2741 字,大约阅读时间需要 9 分钟。

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

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

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

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); } }

你可能感兴趣的文章
poj 2777(线段树的节点更新策略)
查看>>
Swift-EasingAnimation
查看>>
[翻译] BKZoomView
查看>>
C++类设计的一些心得
查看>>
tableVIew删除时的delete按钮被挡住时重写的方法
查看>>
读cookie中文字符乱码问题
查看>>
招募译者翻译并发数据结构
查看>>
普通表转换为分区表
查看>>
Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较
查看>>
性能优化总结(六):预加载、聚合SQL应用实例
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>
package.json
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>