欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android Activity向右滑動(dòng)返回

 更新時(shí)間:2020年06月19日 14:19:26   作者:kincai  
這篇文章主要介紹了Android Activity向右滑動(dòng)返回,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

向右滑動(dòng)返回,對(duì)于屏幕過(guò)大的手機(jī)來(lái)說(shuō),在單手操作時(shí),是一個(gè)不錯(cuò)的用戶體驗(yàn),用戶不必再費(fèi)力的或者用另一個(gè)手去點(diǎn)擊屏幕左上角的返回按鈕或者,手機(jī)右下角的返回按鈕,輕輕向右滑動(dòng)屏幕即可返回上一頁(yè),這個(gè)功能如今大部分APP都已經(jīng)支持啦,你的APP支持了嗎?

自己在網(wǎng)上百度了一些滑動(dòng)返回的方法,有的是用的第三方控件如swipebackLayout但弊端過(guò)大如與自己自定義的一些控件沖突等,有的是通過(guò)判斷手勢(shì)監(jiān)聽(tīng)但步驟相當(dāng)繁瑣,總之沒(méi)有盡如人意的,本篇所講的實(shí)現(xiàn)方法其實(shí)也是通過(guò)監(jiān)聽(tīng)事件分發(fā)來(lái)實(shí)現(xiàn)的,但是步驟非常簡(jiǎn)單,且效果經(jīng)本人不斷測(cè)試也相當(dāng)不錯(cuò),接下來(lái)本人講解下實(shí)現(xiàn)過(guò)程:

實(shí)現(xiàn)該功能需同時(shí)滿足幾個(gè)條件,并要考慮用戶的操作意圖,既要保證足夠的靈敏度,不要出現(xiàn)向右滑動(dòng)好多次還沒(méi)返回上一頁(yè)的情況,也不要出現(xiàn)本來(lái)是想上下滑動(dòng)(斜著上下滑動(dòng))而非向右滑動(dòng)返回,也被判斷為向右滑動(dòng)返回而結(jié)束了當(dāng)前界面,那么我們需要滿足:

1.用戶需向右滑動(dòng)一段距離,且X軸距離>某一設(shè)定的值;

2.因?yàn)橄蛴一瑒?dòng)時(shí),不可能時(shí)嚴(yán)格的水平方向而不向Y軸偏移,所以向Y軸的偏移量不能超過(guò)某一設(shè)定的值,否則認(rèn)為用戶意圖不是滑動(dòng)返回而是上下滑動(dòng);

3.在測(cè)試過(guò)程中,如果用戶意圖是上下滑動(dòng)時(shí),那么手指在y軸移動(dòng)速度(我們按每秒移動(dòng)的像素值,可通過(guò)VelocityTracker類計(jì)算)非常大,通常在幾千到過(guò)萬(wàn),而在正常的水平滑動(dòng)時(shí),y軸的移動(dòng)速度通常只有100左右,因此,我們需要判斷的是,如果y軸上手指滑動(dòng)速度超過(guò)某一設(shè)定值(本人將該值設(shè)置為了1000),則認(rèn)為用戶意圖是上下滑動(dòng)而非向右滑動(dòng)返回;

好了,接下來(lái)我們便可自定義一個(gè)BaseActivity繼承Activity,并在BaseActivity中重寫(xiě)事件分發(fā)dispatchTouchEvent,并記錄手指按下,移動(dòng)的距離及手指滑動(dòng)速度,從而判斷用戶的意圖,完整代碼:

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互聯(lián)網(wǎng)有限公司
 * 
 * @author kincai
 * 
 * @description baseActivity
 *
 * @project Kincai_Store
 *
 * @package com.kincai.store.ui
 *
 * @time 2015-7-13 上午10:18:29
 *
 */
public class BaseActivity extends Activity {
 
 
 // 手指上下滑動(dòng)時(shí)的最小速度
 private static final int YSPEED_MIN = 1000;
 
 // 手指向右滑動(dòng)時(shí)的最小距離
 private static final int XDISTANCE_MIN = 50;
 
 // 手指向上滑或下滑時(shí)的最小距離
 private static final int YDISTANCE_MIN = 66;
 
 private static final String TAG = "BaseActivity";
 
 // 記錄手指按下時(shí)的橫坐標(biāo)。
 private float xDown;
 
 // 記錄手指按下時(shí)的縱坐標(biāo)。
 private float yDown;
 
 // 記錄手指移動(dòng)時(shí)的橫坐標(biāo)。
 private float xMove;
 
 // 記錄手指移動(dòng)時(shí)的縱坐標(biāo)。
 private float yMove;
 
 // 用于計(jì)算手指滑動(dòng)的速度。
 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();
 // 滑動(dòng)的距離
 int distanceX = (int) (xMove - xDown);
 int distanceY = (int) (yMove - yDown);
 // 獲取順時(shí)速度
 int ySpeed = getScrollVelocity();
 // 關(guān)閉Activity需滿足以下條件:
 // 1.x軸滑動(dòng)的距離>XDISTANCE_MIN
 // 2.y軸滑動(dòng)的距離在YDISTANCE_MIN范圍內(nèi)
 // 3.y軸上(即上下滑動(dòng)的速度)<XSPEED_MIN,如果大于,則認(rèn)為用戶意圖是在上下滑動(dòng)而非左滑結(jié)束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);
 
 }
 
 /**
 * 創(chuàng)建VelocityTracker對(duì)象,并將觸摸界面的滑動(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;
 }
 
 /**
 * 
 * @return 滑動(dòng)速度,以每秒鐘移動(dòng)了多少像素值為單位。
 */
 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想實(shí)現(xiàn)滑動(dòng)返回功能的話 直接繼承BaseActivity即可

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論