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

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

效果如下图:

此图为点击第一个Activity跳转到第二个Activity后,向右滑动再返回到第一个Activity。

一、设计思路

1,让一个activity中的根布局实现onTouchListener接口,当手指在屏幕上向右滑动时,我们记下ACTION_DOWN的X轴的位置,在手指滑动时(即ACTION_MOVE),获取滑动时的X轴的位置,当滑动的位置大于某个临界值且在这个方向上的速度大于某个临界值时,我们就认为用户滑动手指的意图是返回上一个页面。

2,按照这种思路下来,我们做出来的向右滑动可以实现这个功能,但是会感觉很生硬,没有任何的过度就返回到上一个页面了,为此,在这里为activity加上了启动和结束的过度动画。这就是实现的思路,非常简单,下面看代码吧。

二、主要的代码

这个demo中,我写了三个activity,activity1可以跳转到activity2,activity2可以跳转到activity3,activity3可以滑动返回到activity2,activity2可以滑动返回到activity1。主要的逻辑代码都放在了Activity2中,代码如下:

package org.sunday.slidingreturn; import com.example.slidingreturn.R; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.LinearLayout; /** * * @author sunday * 2014-1-4 * zhengchao1937@163.com */ public class SecondActivity extends Activity implements OnTouchListener { //手指向右滑动时的最小速度 private static final int XSPEED_MIN = 200; //手指向右滑动时的最小距离 private static final int XDISTANCE_MIN = 150; //记录手指按下时的横坐标。 private float xDown; //记录手指移动时的横坐标。 private float xMove; //用于计算手指滑动的速度。 private VelocityTracker mVelocityTracker; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Button btn = (Button) findViewById(R.id.btn_second); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(SecondActivity.this, ThirdActivity.class)); //设置切换动画,从右边进入,左边退出 overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left); } }); LinearLayout ll = (LinearLayout) findViewById(R.id.ll_second); ll.setOnTouchListener(this); } // 转载请说明出处:http://blog.csdn.net/ff20081528/article/details/17845753 @Override public boolean onTouch(View v, MotionEvent event) { createVelocityTracker(event); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: xDown = event.getRawX(); break; case MotionEvent.ACTION_MOVE: xMove = event.getRawX(); //活动的距离 int distanceX = (int) (xMove - xDown); //获取顺时速度 int xSpeed = getScrollVelocity(); //当滑动的距离大于我们设定的最小距离且滑动的瞬间速度大于我们设定的速度时,返回到上一个activity if(distanceX > XDISTANCE_MIN && xSpeed > XSPEED_MIN) { finish(); } break; case MotionEvent.ACTION_UP: recycleVelocityTracker(); break; default: break; } return true; } /** * 创建VelocityTracker对象,并将触摸content界面的滑动事件加入到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; } /** * 获取手指在content界面滑动的速度。 * * @return 滑动速度,以每秒钟移动了多少像素值为单位。 */ private int getScrollVelocity() { mVelocityTracker.computeCurrentVelocity(1000); int velocity = (int) mVelocityTracker.getXVelocity(); return Math.abs(velocity); } }

注释我写的很清楚了,大家可以直接下载demo来看很简单,这个demo中的滑动返回的实现和Activity的耦合性很高,今天主要就说下实现思路好过程,过几天会把这个抽象出来成为一个组件使用。

时间: 2024-10-29 14:26:55

IOS开发向右滑动返回前一个页面功能(demo)的相关文章

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

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

iOS开发之微信聊天页面实现

在上篇博客(iOS开发之微信聊天工具栏的封装)中对微信聊天页面下方的工具栏进行了封装,本篇博客中就使用之前封装的工具栏来进行聊天页面的编写.在聊天页面中主要用到了TableView的知识,还有如何在俩天中显示我们发送的表情,具体请参考之前的博客:IOS开发之显示微博表情,在这儿就不做赘述啦.在聊天页面用到了三对,六种Cell,不过cell的复杂度要比之前的新浪微博(IOS开发之新浪围脖)简单的多.废话少说吧,还是先来几张效果图,在给出实现代码吧. 聊天界面的效果图如下:在下面的聊天界面中中用到了

iOS开发中使用屏幕旋转功能的相关方法_IOS

加速计是整个IOS屏幕旋转的基础,依赖加速计,设备才可以判断出当前的设备方向,IOS系统共定义了以下七种设备方向:   复制代码 代码如下: typedef NS_ENUM(NSInteger, UIDeviceOrientation) {     UIDeviceOrientationUnknown,     UIDeviceOrientationPortrait,            // Device oriented vertically, home button on the bot

ios开发-高德地图的搜索功能的实现

问题描述 高德地图的搜索功能的实现 我这里项目的需要是,使用高德地图, 要把地图上距离我当前位置这个大头针显示的位置的2公里之内的住宿,酒店,餐饮的信息, 全部检索到并显示在地图上, 我这里在项目里面要显示结果的地方添加的代码如下, //初始化检索对象 _searchMapView = [[AMapSearchAPI alloc] initWithSearchKey:@"549f6a2bfd98c54aaf000c6f" Delegate:self]; if ([kCurentLang

IOS开发账号申请

iOS开发者的申请流程 如果你是一个开发团队,在你打算掏腰包购买iOS开发者授权之前,最好先问一下你的同事,是否已经有人获得了开发许可,因为一个开发许可一年内最多可以授权给111个设备来开发测试.如果你没有授权许可可以借用,或者你打算最终在iTunes Store中以自己的名义发布你的应用,那么就准备一张国际信用卡,准备支付99美元来申请一个iOS开发者授权. 点击下面链接进入Apple Developer Centerhttp://developer.apple.com/ 点击页面左边中部的i

iOS开发之使用XMPPFramework实现即时通信(二)

上篇的博客iOS开发之使用XMPPFramework实现即时通信(一)只是本篇的引子,本篇博客就给之前的微信加上即时通讯的功能,主要是对XMPPFramework的使用.本篇博客中用到了Spark做测试,当然也少不了Openfire服务器,在这就不详述Openfire的安装过程了(网上的教程还是蛮多的),Openfire的安装仅需要一个数据库的支持,本篇是用的MySql数据库.当然这不是本篇的重点. 废话少说,切入今天的正题.今天要给之前的微信加入登陆,获取好友列表,聊天(发送文字,表情,图片,

iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流

在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,Cell的最大以及最小高度是在我们的布局文件中是写死的,换句话说也就是不可配置的.为了循序渐进,由浅入深呢,上篇博客暂且那么写.不过那样写太过死板,本来使用起来比较灵活的自定义布局,如果把其配置参数给写死了,就相当于在笼中的猛兽,再厉害不也白扯蛮. 在今天这篇博客中我们要接着上篇博客中的Demo,使其自定义布局

IOS开发之支付功能概述

前言:本随笔将对IOS开发的支付功能进行一个概述. 内容大纲: 一.常见的支付方案简介 二.第三方支付SDK 三.苹果官方支付方案 四.Web支付方案   正文: 一.常见的支付方案简介 在微信支付中 微信支付的网址是: https://pay.weixin.qq.com/wiki/doc/api/index.html 进去之后,我们可以看到网页,但我接下来主要讲的是app支付   app支付的过程:商业app通过集成微信SDK,用户解析后跳转到微信内软件支付的过程. 点进去app支付:   我

【转】怎么让开发的aspx返回的页面网页源文件中没有“乱码”ViewState???

问:怎么让开发的aspx返回的页面网页源文件中没有Value="/wEPDwUKMTQxODY3MTE1NWRk9iXX,什么hidden" name="__EVENTTARGET" 这些东西? 说明:返回的页面代码都是标准的HTML组件?有例子没有?推荐书籍也可以.开发的ASPX网页导出都是下面这些东西,<input type="hidden" name="__EVENTTARGET" id="__EVENT