在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
* [email protected]
*/
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的耦合性很高,今天主要就說下實作思路好過程,過幾天會把這個抽象出來成為一個元件使用。
demo:http://download.csdn.net/detail/ff20081528/6815661
轉載請說明出處:http://blog.csdn.net/ff20081528/article/details/17845753
如果覺得文章對你有那麼一點小幫助,請揮動下你的小手,點選下面的“頂”字或者給個評論。