Android實現全域性右滑返回
阿新 • • 發佈:2020-04-20
目前Android手機的全面屏越來越盛行,很多應用都已經支援了右滑返回上一級頁面的功能,那麼這個功能如何實現呢?
首先來說下思路吧,主要是通過 MotionEvent 這個事件通過對這個事件的不同處理,在通過 PointF 來監聽按下去的點,處於什麼位置。
接下來,通過程式碼給大家講解一下
顯示新建一個Gesture的這個樣一個類,用來處理,滑動的邏輯。
public class GestureHandler {}
接下來是定義相關的一些螢幕寬高、滑動的區間的一些表示
//螢幕寬高 int sWidth = 1280; int sHeight = 720; //按下的點 PointF down; //Y軸滑動的區間 float minY,maxY; //按下時的時間 long downTime; //邊緣判定距離, double margin = sWidth * 0.035; //Y軸最大區間範圍,即Y軸滑動超出這個範圍不觸發事件 double height = sHeight * 0.2; //X軸最短滑動距離 X軸滑動範圍低於此值不觸發事件 double width = sWidth * 0.1; //是否處於此次滑動事件 boolean work = false;
當然了,這裡我的螢幕是這樣子,螢幕的寬高是按照自己的實際情況的。
然後是用 PointF 來監聽
public boolean point(PointF up) { long upTime = System.currentTimeMillis(); float tWidth = Math.abs(down.x - up.x); if (maxY - minY < height && tWidth > width && (upTime - downTime) / tWidth < 2.5) { //起點在左邊 if (down.x < margin) { left();//左滑需要處理的邏輯的方法 return true; } } return false; }
在定義好之後就可以使用MontionEvent,來進行一個處理了
public boolean doEventF(MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: //記錄下按下的點 downTime = System.currentTimeMillis(); down = new PointF(event.getX(),event.getY()); minY = maxY = down.y; //判定是否處於邊緣側滑 if (down.x < margin || (sWidth - down.x) < margin) work = true; break; case MotionEvent.ACTION_MOVE: //記錄滑動Y軸區間 if (work) if (event.getY() > down.y) { maxY = event.getY(); } else { minY = event.getY(); } break; case MotionEvent.ACTION_UP: if (work) { handle(new PointF(event.getX(),event.getY())); work = false; return true; } work = false; } return work; }
那這裡是左滑退出當前activity
public void left() { //處理左邊緣滑動事件,這裡你可以自己寫一個ActivityUtil,用來finish當前的activity(這個網上很多,隨便搜一下就有了) }
這裡處理好之後,就要思考一下了,如何能達到全域性的右滑返回了,那麼你就需要讓所有的activity繼承一個BaseActivity,然後再這個基類裡面來處理是否需要右滑返回。
/** 手勢監聽 */ GestureHandler mGestureHandler; /** 是否需要監聽手勢關閉功能 */ private boolean mNeedBackGesture = false;
然後通過一個dispatchTouchEvent 來進行一個手勢分發
@Override public boolean dispatchTouchEvent(MotionEvent event){ //TODO Auto-generated method stub if (mNeedBackGesture){ return mGestureHandler.doEventF(event) || super.dispatchTouchEvent(event); } return super.dispatchTouchEvent(event); }
設定一個手勢監聽,便於一些特殊的activity設定不可滑動退出,比如首頁
public final void setNeedBackGesture(boolean mNeedBackGesture){ this.mNeedBackGesture = mNeedBackGesture; }
那麼你在使用的時候只需要再onCreate方法裡面 new 一個Gesture物件就好了
如果你想在首頁做不返回,同樣在onCreate方法裡面設定setNeedBackGesrure(false)就還可以了
這樣你就實現了一個全域性的右滑返回了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。