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即可

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

(0)

相关推荐

  • 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向右滑动返回

    向右滑动返回,对于屏幕过大的手机来说,在单手操作时,是一个不错的用户体验,用户不必再费力的或者用另一个手去点击屏幕左上角的返回按钮或者,手机右下角的返回按钮,轻轻向右滑动屏幕即可返回上一页,这个功能如今大部分APP都已经支持啦,你的APP支持了吗? 自己在网上百度了一些滑动返回的方法,有的是用的第三方控件如swipebackLayout但弊端过大如与自己自定义的一些控件冲突等,有的是通过判断手势监听但步骤相当繁琐,总之没有尽如人意的,本篇所讲的实现方法其实也是通过监听事件分发来实现的,但是步骤非

  • 剖析Android Activity侧滑返回的实现原理

    简介 使用侧滑Activity返回很常见,例如微信就用到了.那么它是怎么实现的呢.本文带你剖析一下实现原理.我在github上找了一个star有2.6k的开源,我们分析他是怎么实现的 //star 2.6k 'com.r0adkll:slidableactivity:2.0.5' Slidr使用示例 它的使用很简单,首先要设置透明的窗口背景 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBa

  • Android中activity处理返回结果的实现方式

    大家在网上购物时都有这样一个体验,在确认订单选择收货人以及地址时,会跳转页面到我们存入网站内的所有收货信息(包含收货地址,收货人)的界面供我们选择,一旦我们点击其中某一条信息,则会自动跳转到订单提交界面,此时的收货信息已经变为我们之前选择的收件信息. 为了实现这个功能,Android提供了一个机制,跳转到其他activity时,再返回,可以接受到其他activity返回的值,无需再start新的当前activity:下面的示例中,创建两个activity,其中在MainActivity中提示输入

  • Android中调用另一个Activity并返回结果(选择头像功能为例)

    场景 Android中点击按钮启动另一个Activity以及Activity之间传值: https://www.jb51.net/article/178218.htm 在上面启动Activity和传值之后,怎样获取Acitvity的返回值.下面示例实现点击选择头像按钮,跳转到头像显示Activity,并将选择的图片的索引返回,在MainActivity中获取后设置头像. 效果 注: 实现 首先是主页面MainActivity的布局,添加一个选择头像按钮和一个ImageView用来显示头像. <?

  • Android利用startActivityForResult返回数据到前一个Activity

    在Android里面,从一个Activity跳转到另一个Activity.再返回,前一个Activity默认是能够保存数据和状态的.但这次我想通过利用startActivityForResult达到相同的目的,虽然看起来变复杂了,但可以探索下startActivityForResult背后的原理和使用注意事项. 要实现的功能如下: 从Activity A将数据传到Activity B,再从Activity B中获取数据后,再传回Activity A.在Activity B中添加一个"回到上一页&

  • android studio组件通信:Intend启动Activity接收返回结果

    实验目的: 熟悉和掌握Android组件间通信的方式和技巧. 实验要求: 1.运行课本的示例程序,理解组件通信的方式和过程2.设计一个主Activity和一个子Activity(Sub-Activity),使用主Activity上的按钮启动子Activity,并将子Activity的一些信息返回给主Activity,并显示在主Activity上. 可以自己设计界面和场景,也可以使用下面提供的内容: 主Activity界面上有一个“登录”按钮和一个用了显示信息的TextView,点击“登录”按钮后

  • IOS开发向右滑动返回前一个页面功能(demo)

    在ios7中,苹果的原生态应用几乎都能够通过向右滑动来返回到前一个页面,这样可以避免用户在单手操作时用大拇指去点击那个遥远的返回键(iphone5的这种返回被吐糟为反人类设计).然而现在android的手机市场上几乎很难找到小于4寸屏的手机了,几乎所有的应用都是通过点击左上角的返回来退到上一个页面,如果单手拿一个大屏手机,我是觉得会发疯.为此花了点时间写了个向右滑动返回的demo. 效果如下图: 此图为点击第一个Activity跳转到第二个Activity后,向右滑动再返回到第一个Activit

  • Android Activity启动模式之standard实例详解

    本文实例讲述了Android Activity启动模式之standard.分享给大家供大家参考,具体如下: Android的活动是通过任务Task来进行管理的,一个任务就是一组放在栈里的活动的集合,即所谓的返回栈(Back Stack).栈具有先进后出.后进先出的特性.当启动一个活动时,活动会在返回栈中入栈,处于栈顶位置,当按下返回键或者调用finish方法会销毁一个活动,此时栈顶活动会出栈,届时又会有新的活动处于栈顶位置. 在Android中,活动的启动模式有四种,根据不同的需求可以为活动设置

  • Android Activity与Intent详解及示例代码

    Android有三个基础组件Activity,Service和BroadcastReceiver,他们都是依赖Intent来启动.本文介绍的是Activity的生命周期以及针对Activity的Intent使用. 之前的例子一直都是使用Activity,在一个Layout XML与一个Activity捆绑的情况下可以视为一个Form,多个Layout XML与一个Activity捆绑的话那就是个Application本身了.Intent可以分为显式Intent和隐式Intent:显式Intent

  • Android Activity启动模式之singleTask实例详解

    本文实例分析了Android Activity启动模式之singleTask.分享给大家供大家参考,具体如下: 前面的文章介绍了Android 活动Activity的启动模式:standard 和singleTop .本文继续介绍Activity的下一个启动模式:singleTask. singleTask:当设置活动的启动模式为singleTask时,首先检查返回栈中是否存在当前活动,如果存在当前活动的实例,则直接使用当前实例,并把当前活动之上的所有活动pop出栈,即当前活动位于栈顶位置. 代

随机推荐