IOS開(kāi)發(fā)向右滑動(dòng)返回前一個(gè)頁(yè)面功能(demo)
在ios7中,蘋(píng)果的原生態(tài)應(yīng)用幾乎都能夠通過(guò)向右滑動(dòng)來(lái)返回到前一個(gè)頁(yè)面,這樣可以避免用戶在單手操作時(shí)用大拇指去點(diǎn)擊那個(gè)遙遠(yuǎn)的返回鍵(iphone5的這種返回被吐糟為反人類(lèi)設(shè)計(jì))。然而現(xiàn)在android的手機(jī)市場(chǎng)上幾乎很難找到小于4寸屏的手機(jī)了,幾乎所有的應(yīng)用都是通過(guò)點(diǎn)擊左上角的返回來(lái)退到上一個(gè)頁(yè)面,如果單手拿一個(gè)大屏手機(jī),我是覺(jué)得會(huì)發(fā)瘋。為此花了點(diǎn)時(shí)間寫(xiě)了個(gè)向右滑動(dòng)返回的demo。
效果如下圖:
此圖為點(diǎn)擊第一個(gè)Activity跳轉(zhuǎn)到第二個(gè)Activity后,向右滑動(dòng)再返回到第一個(gè)Activity。
一、設(shè)計(jì)思路
1,讓一個(gè)activity中的根布局實(shí)現(xiàn)onTouchListener接口,當(dāng)手指在屏幕上向右滑動(dòng)時(shí),我們記下ACTION_DOWN的X軸的位置,在手指滑動(dòng)時(shí)(即ACTION_MOVE),獲取滑動(dòng)時(shí)的X軸的位置,當(dāng)滑動(dòng)的位置大于某個(gè)臨界值且在這個(gè)方向上的速度大于某個(gè)臨界值時(shí),我們就認(rèn)為用戶滑動(dòng)手指的意圖是返回上一個(gè)頁(yè)面。
2,按照這種思路下來(lái),我們做出來(lái)的向右滑動(dòng)可以實(shí)現(xiàn)這個(gè)功能,但是會(huì)感覺(jué)很生硬,沒(méi)有任何的過(guò)度就返回到上一個(gè)頁(yè)面了,為此,在這里為activity加上了啟動(dòng)和結(jié)束的過(guò)度動(dòng)畫(huà)。這就是實(shí)現(xiàn)的思路,非常簡(jiǎn)單,下面看代碼吧。
二、主要的代碼
這個(gè)demo中,我寫(xiě)了三個(gè)activity,activity1可以跳轉(zhuǎn)到activity2,activity2可以跳轉(zhuǎn)到activity3,activity3可以滑動(dòng)返回到activity2,activity2可以滑動(dòng)返回到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 { //手指向右滑動(dòng)時(shí)的最小速度 private static final int XSPEED_MIN = 200; //手指向右滑動(dòng)時(shí)的最小距離 private static final int XDISTANCE_MIN = 150; //記錄手指按下時(shí)的橫坐標(biāo)。 private float xDown; //記錄手指移動(dòng)時(shí)的橫坐標(biāo)。 private float xMove; //用于計(jì)算手指滑動(dòng)的速度。 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)); //設(shè)置切換動(dòng)畫(huà),從右邊進(jìn)入,左邊退出 overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left); } }); LinearLayout ll = (LinearLayout) findViewById(R.id.ll_second); ll.setOnTouchListener(this); } // 轉(zhuǎn)載請(qǐng)說(shuō)明出處: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(); //活動(dòng)的距離 int distanceX = (int) (xMove - xDown); //獲取順時(shí)速度 int xSpeed = getScrollVelocity(); //當(dāng)滑動(dòng)的距離大于我們?cè)O(shè)定的最小距離且滑動(dòng)的瞬間速度大于我們?cè)O(shè)定的速度時(shí),返回到上一個(gè)activity if(distanceX > XDISTANCE_MIN && xSpeed > XSPEED_MIN) { finish(); } break; case MotionEvent.ACTION_UP: recycleVelocityTracker(); break; default: break; } return true; } /** * 創(chuàng)建VelocityTracker對(duì)象,并將觸摸content界面的滑動(dòng)事件加入到VelocityTracker當(dāng)中。 * * @param event * */ private void createVelocityTracker(MotionEvent event) { if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(event); } /** * 回收VelocityTracker對(duì)象。 */ private void recycleVelocityTracker() { mVelocityTracker.recycle(); mVelocityTracker = null; } /** * 獲取手指在content界面滑動(dòng)的速度。 * * @return 滑動(dòng)速度,以每秒鐘移動(dòng)了多少像素值為單位。 */ private int getScrollVelocity() { mVelocityTracker.computeCurrentVelocity(1000); int velocity = (int) mVelocityTracker.getXVelocity(); return Math.abs(velocity); } }
注釋我寫(xiě)的很清楚了,大家可以直接下載demo來(lái)看很簡(jiǎn)單,這個(gè)demo中的滑動(dòng)返回的實(shí)現(xiàn)和Activity的耦合性很高,今天主要就說(shuō)下實(shí)現(xiàn)思路好過(guò)程,過(guò)幾天會(huì)把這個(gè)抽象出來(lái)成為一個(gè)組件使用。
相關(guān)文章
Android編程實(shí)現(xiàn)自定義手勢(shì)的方法詳解
這篇文章主要介紹了Android編程實(shí)現(xiàn)自定義手勢(shì)的方法,結(jié)合實(shí)例形式分析了Android自定義手勢(shì)的功能、相關(guān)函數(shù)與具體實(shí)現(xiàn)步驟,需要的朋友可以參考下2016-10-10Android開(kāi)發(fā)之微信底部菜單欄實(shí)現(xiàn)的幾種方法匯總
這篇文章主要介紹了Android開(kāi)發(fā)之微信底部菜單欄實(shí)現(xiàn)的幾種方法,下面小編把每種方法通過(guò)實(shí)例逐一給大家介紹,需要的朋友可以參考下2016-09-09Android bindService的使用與Service生命周期案例詳解
這篇文章主要介紹了Android bindService的使用與Service生命周期案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09Android引導(dǎo)頁(yè)面的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android引導(dǎo)頁(yè)面的簡(jiǎn)單實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Android自定義View實(shí)現(xiàn)水面上漲效果
這篇文章給大家介紹了利用Android自定義View實(shí)現(xiàn)水面上漲效果,對(duì)大家日常開(kāi)發(fā)很有幫助,有需要的朋友們可以參考借鑒。2016-09-09Android Studio導(dǎo)入Eclipse項(xiàng)目的兩種方法
本文主要介紹了Android Studio導(dǎo)入Eclipse項(xiàng)目的兩種方法。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01