右滑动返回

	在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中,代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package org.sunday.slidingreturn;  
  2.   
  3. import com.example.slidingreturn.R;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Intent;  
  7. import android.os.Bundle;  
  8. import android.view.MotionEvent;  
  9. import android.view.VelocityTracker;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.view.View.OnTouchListener;  
  13. import android.widget.Button;  
  14. import android.widget.LinearLayout;  
  15.   
  16. /** 
  17.  *  
  18.  * @author sunday 
  19.  *  2014-1-4 
  20.  *  zhengchao1937@163.com 
  21.  */  
  22. public class SecondActivity extends Activity implements OnTouchListener {  
  23.       
  24.     //手指向右滑动时的最小速度  
  25.     private static final int XSPEED_MIN = 200;  
  26.       
  27.     //手指向右滑动时的最小距离  
  28.     private static final int XDISTANCE_MIN = 150;  
  29.       
  30.     //记录手指按下时的横坐标。  
  31.     private float xDown;  
  32.       
  33.     //记录手指移动时的横坐标。  
  34.     private float xMove;  
  35.       
  36.     //用于计算手指滑动的速度。  
  37.     private VelocityTracker mVelocityTracker;  
  38.       
  39.     @Override  
  40.     protected void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         setContentView(R.layout.activity_second);  
  43.           
  44.         Button btn = (Button) findViewById(R.id.btn_second);  
  45.         btn.setOnClickListener(new OnClickListener() {  
  46.             @Override  
  47.             public void onClick(View v) {  
  48.                 startActivity(new Intent(SecondActivity.this, ThirdActivity.class));  
  49.                 //设置切换动画,从右边进入,左边退出  
  50.                 overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);  
  51.             }  
  52.         });  
  53.           
  54.         LinearLayout ll = (LinearLayout) findViewById(R.id.ll_second);  
  55.         ll.setOnTouchListener(this);  
  56.     }  
  57. // 转载请说明出处:http://blog.csdn.net/ff20081528/article/details/17845753  
  58.     @Override  
  59.     public boolean onTouch(View v, MotionEvent event) {  
  60.         createVelocityTracker(event);  
  61.         switch (event.getAction()) {  
  62.         case MotionEvent.ACTION_DOWN:  
  63.             xDown = event.getRawX();  
  64.             break;  
  65.         case MotionEvent.ACTION_MOVE:  
  66.             xMove = event.getRawX();  
  67.             //活动的距离  
  68.             int distanceX = (int) (xMove - xDown);  
  69.             //获取顺时速度  
  70.             int xSpeed = getScrollVelocity();  
  71.             //当滑动的距离大于我们设定的最小距离且滑动的瞬间速度大于我们设定的速度时,返回到上一个activity  
  72.             if(distanceX > XDISTANCE_MIN && xSpeed > XSPEED_MIN) {  
  73.                 finish();  
  74.             }  
  75.             break;  
  76.         case MotionEvent.ACTION_UP:  
  77.             recycleVelocityTracker();  
  78.             break;  
  79.         default:  
  80.             break;  
  81.         }  
  82.         return true;  
  83.     }  
  84.       
  85.     /** 
  86.      * 创建VelocityTracker对象,并将触摸content界面的滑动事件加入到VelocityTracker当中。 
  87.      *  
  88.      * @param event 
  89.      *         
  90.      */  
  91.     private void createVelocityTracker(MotionEvent event) {  
  92.         if (mVelocityTracker == null) {  
  93.             mVelocityTracker = VelocityTracker.obtain();  
  94.         }  
  95.         mVelocityTracker.addMovement(event);  
  96.     }  
  97.       
  98.     /** 
  99.      * 回收VelocityTracker对象。 
  100.      */  
  101.     private void recycleVelocityTracker() {  
  102.         mVelocityTracker.recycle();  
  103.         mVelocityTracker = null;  
  104.     }  
  105.       
  106.     /** 
  107.      * 获取手指在content界面滑动的速度。 
  108.      *  
  109.      * @return 滑动速度,以每秒钟移动了多少像素值为单位。 
  110.      */  
  111.     private int getScrollVelocity() {  
  112.         mVelocityTracker.computeCurrentVelocity(1000);  
  113.         int velocity = (int) mVelocityTracker.getXVelocity();  
  114.         return Math.abs(velocity);  
  115.     }  
  116. }  



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

 

demo:http://download.csdn.net/detail/ff20081528/6815661

 

 转载请说明出处:http://blog.csdn.net/ff20081528/article/details/17845753

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值