Android Activity向右滑动返回

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

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

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

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

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

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

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

package com.kincai.store.ui;

import com.kincai.store.utils.LogTest;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.VelocityTracker;

/**
 *
 * @company KCS互联网有限公司
 *
 * @author kincai
 *
 * @description baseActivity
 *
 * @project Kincai_Store
 *
 * @package com.kincai.store.ui
 *
 * @time 2015-7-13 上午10:18:29
 *
 */
public class BaseActivity extends Activity {

 // 手指上下滑动时的最小速度
 private static final int YSPEED_MIN = 1000;

 // 手指向右滑动时的最小距离
 private static final int XDISTANCE_MIN = 50;

 // 手指向上滑或下滑时的最小距离
 private static final int YDISTANCE_MIN = 66;

 private static final String TAG = "BaseActivity";

 // 记录手指按下时的横坐标。
 private float xDown;

 // 记录手指按下时的纵坐标。
 private float yDown;

 // 记录手指移动时的横坐标。
 private float xMove;

 // 记录手指移动时的纵坐标。
 private float yMove;

 // 用于计算手指滑动的速度。
 private VelocityTracker mVelocityTracker;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 // TODO Auto-generated method stub
 super.onCreate(savedInstanceState);
 LogTest.LogMsg(TAG, "BaseActivity-onCreate");

 }

 @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() {
 //1000速度
 mVelocityTracker.computeCurrentVelocity(1000);
 int velocity = (int) mVelocityTracker.getYVelocity();
 return Math.abs(velocity);
 }

 @Override
 protected void onStart() {
 // TODO Auto-generated method stub
 super.onStart();
 LogTest.LogMsg(TAG, "BaseActivity-onStart");
 }

 @Override
 protected void onResume() {
 // TODO Auto-generated method stub
 super.onResume();
 LogTest.LogMsg(TAG, "BaseActivity-onResume");
 }

 @Override
 protected void onPause() {
 // TODO Auto-generated method stub
 super.onPause();
 LogTest.LogMsg(TAG, "BaseActivity-onPause");
 }

 @Override
 protected void onDestroy() {
 // TODO Auto-generated method stub
 super.onDestroy();
 LogTest.LogMsg(TAG, "BaseActivity-onDestroy");
 }

}

程序activity想实现滑动返回功能的话 直接继承BaseActivity即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2020-06-17

Android 滑动返回Activity的实现代码

Android 滑动返回Activity的实现代码 近来玩微信的时候偶然发现,向左滑动朋友圈竟然可以返回主页,故引起兴趣特研究 代码很简洁 package com.example.wyj.cainiaoshopping.activity; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import com.

实现Android 滑动退出Activity的功能

实现Android 滑动退出Activity的功能 android向右滑动,退出activity //右滑删除 compile 'com.jude:swipebackhelper:3.1.2' 然后在Baseactivity中添加代码: 实现代码: SwipeBackHelper.onCreate(this); SwipeBackHelper.getCurrentPage(this) .setSwipeBackEnable(true) .setSwipeSensitivity(0.5f) .se

Android开发之使用150行代码实现滑动返回效果

今天带大家实现滑动返回效果.,具体内容如下所示: 先看看效果图: 因为没有具体内容,也没有简书的图片资源,所以稍微简陋了点. 但是依然不妨碍我们的效果展示~ OK,接下来惯例,通过阅读本文你能学习到: ViewDragHelper的使用(如果你想学习自定义View,那么ViewDragHelper你绝对不能错过) 好像也没有什么了.... 这个效果,难度不大,会ViewDragHelper的同学应该10分钟就能写出来了吧~ 如果不会也没关系~ 1. 我们自定义一个SwipeBackFrameLa

Android仿微信右滑返回功能的实例代码

先上效果图,如下: 先分析一下功能的主要技术点,右滑即手势判断,当滑到一直距离时才执行返回,并且手指按下的位置是在屏幕的最左边(这个也是有一定范围的),  这些可以实现onTouchEvent来实现. 接着就是返回时,有滑动效果,很显然这个是Acitivty切换动画实现的.好啦,分析完了就开干.下面上代码: @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case Mot

Android仿考拉全局滑动返回及联动效果的实现方法

前言 首次通过右滑来返回到上一个页面的操作是在 IOS7上出现.到目前android应用上支持这种操作的依然不多.分析其主要原因应该是android已有实体的返回按键,这样的功能变得不重要,但我觉得有这样的功能便于单手操作,能提升app的用户体验,特别是从ios转到android的用户.写这篇博文希望可以对大家有所帮助,希望自己的app上有滑动返回功能的可以参考下. 原理的简单描述 Android系统里有很多滑动相关的API和类,比如ViewDragHelper就是一个很好的滑动助手类.首先设置

Android使用SlidingPaneLayout 实现仿微信的滑动返回

上周,公司的项目改版要求加上一个右滑返回上一个界面,于是就在网上找了一些开源库打算实现.但是在使用的时候遇见了许多的问题.试了两天用过 https://github.com/ikew0ng/SwipeBackLayout , https://github.com/r0adkll/Slidr 等库都没成功. 然后在//www.jb51.net/article/138869.htm看见了使用SlidingPaneLayout 来实现的一个滑动返回案例然后就看了看发现不错于是就使用了这个. 虽然上面链

Android仿微信activity滑动关闭效果

Android仿微信activity滑动关闭功能 1.利用具体利用v4包下的slidingPaneLayout实现透明的activity,代码如下: BaseActivity: public class BaseSlideCloseActivity extends AppCompatActivity implements SlidingPaneLayout.PanelSlideListener { @Override protected void onCreate(Bundle savedIns

Android中ActionBar和ToolBar添加返回箭头的实例代码

 1.ActionBar添加返回箭头 //onCreate方法中 ActionBar actionBar = this.getSupportActionBar(); actionBar.setTitle("搜索功能"); actionBar.setDisplayHomeAsUpEnabled(true); //activity类中的方法 @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.get

Android自定义滑动验证条的示例代码

本文介绍了Android自定义滑动验证条的示例代码,分享给大家,具体如下: *注:不知道为什么,h5的标签在这里没用了,所以我也只能用Markdown的语法来写了 项目地址:https://github.com/994866755/handsomeYe.seekbar.github.io 需求: 在我们的某些应用中需要滑动验证.比如说这个样子的: 刚开始我也很懵逼要怎么去弄,结果我去看了一些人的代码,有人是用自定义viewgroup去做,就是viewgroup包含滑动块和滑动条.但我觉得太麻烦,

Android滑动删除数据功能的实现代码

今天学习了新的功能那就是滑动删除数据.先看一下效果 我想这个效果大家都很熟悉吧.是不是在qq上看见过这个效果.俗话说好记性不如赖笔头,为了我的以后,为了跟我一样自学的小伙伴们,我把我的代码粘贴在下面. activity_lookstaff.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.co