国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android仿iOS側滑退出當前界面功能

2019-10-22 18:21:35
字體:
來源:轉載
供稿:網友

我們都知道在ios手機上面,有一個側滑退出當前界面的功能,但是在安卓手機上系統沒有給我們提供這樣的功能,但是這依然阻擋不了強大的安卓的定制功能,我們完全可以自己定制一套這樣的功能。

首先看下效果圖:

Android,ios,側滑退出,當前界面,Android側滑退出當前界面,Android側滑退出界面

分析:

(1)要想模仿ios的這種效果,因為我們通過手指的滑動,所以這里肯定跟我們的滑動事件有關系(onInterceptTouchEvent,onTouchEvent這兩個方法的關系,如果不清楚,請直接查閱事件傳遞機制原理)

(2)我們要想直接攔截我們的所有觸摸事件,我們可以在上層父級布局中進行攔截和處理,這里我們想到了DecorView。首先我們應該知道Activity的頂級父View是DecorView,獲取我們的DecorView也很簡單

getWindow().getDecorView() 

我們平時寫的那些xml布局文件都是包裹在這個DecorView中的,所以這里我們就有了一個思路:
我們可以在我們的xml布局和DecorView中間添加一個中間布局(SlidingLayout),然后所有的滑動邏輯和滑動沖突全部在這里面處理。

(3)比較關鍵的是:當我們需要使用側滑動能的Activity我們需要將它的主題設置成透明,這樣滑動的時候就不會遮擋下面的Activity,代碼如下:

<style name="AppTheme.Slide" parent="@style/AppTheme">   <!--Required-->   <item name="android:windowBackground">@android:color/transparent</item>   <item name="android:windowIsTranslucent">true</item>   <item name="android:windowAnimationStyle">@style/AppTheme.Slide.Animation</item>  </style> 

(4)當我們滑動超過半屏的時候,退出當前界面,否則則回退到原始位置。這里使用Scroller

下面直接上代碼進行分析:

1)、觸摸事件的處理過程,按下的位置大于X軸的十分之一就攔截當前事件,交給SlidingLayout的onTouchEvent處理

/**  * 根據手指移動的距離判斷是否攔截觸摸事件  *  * @param ev  * @return  */  @Override  public boolean onInterceptTouchEvent(MotionEvent ev) {    int x = (int) ev.getX();   int y = (int) ev.getY();   boolean mIntercept = false;   switch (ev.getAction()) {    case MotionEvent.ACTION_DOWN:      mInterceptDownX = x;     mLastInterceptX = x;     mLastInterceptY = y;     break;    case MotionEvent.ACTION_MOVE:      int moveX = x - mLastInterceptX;     int moveY = y - mLastInterceptY;     //按下的位置的X位置小于屏幕的十分之一,并且x移動的距離大于y移動的距離,就攔截     if (mInterceptDownX < (getWidth() / 10) && Math.abs(moveX) > Math.abs(moveY)) {      mIntercept = true;     } else {      mIntercept = false;     }     mLastInterceptX = x;     mLastInterceptY = y;      break;    case MotionEvent.ACTION_UP: //抬起的時候重置參數     mIntercept = false;     mInterceptDownX = mLastInterceptX = mLastInterceptY = 0;     break;   }   return mIntercept;  }   private int mTouchDownX;  private int mLastTouchX;  private int mLastTouchY;   @Override  public boolean onTouchEvent(MotionEvent event) {    boolean mConsumed = false;   int x = (int) event.getX();   int y = (int) event.getY();   switch (event.getAction()) {    case MotionEvent.ACTION_DOWN:      mTouchDownX = x;     mLastTouchX = x;     mLastTouchY = y;     break;    case MotionEvent.ACTION_MOVE:      int moveX = x - mLastTouchX;     int moveY = y - mLastTouchY;     if (mTouchDownX < (getWidth() / 10) && Math.abs(moveX) > Math.abs(moveY) && !mConsumed) {      mConsumed = true;     }     if (mConsumed) {      int rightMoveX = (int) (mLastTouchX - event.getX());      if ((getScrollX() + rightMoveX) > 0) { //向左滑動的時候,getScrollX()和rightMoveX都大于0,所以禁止滑動       scrollTo(0, 0);      } else {       scrollBy(rightMoveX, 0);      }     }     mLastTouchX = x;     mLastTouchY = y;     break;    case MotionEvent.ACTION_UP:      mConsumed = false;     mTouchDownX = mLastTouchX = mLastTouchY = 0;     if(-getScrollX()<getWidth()/2){ //偏移量不到屏幕寬度的一般,就回到最初的位置      scrollBack();     }else{      scrollFinish();     }     break;    case MotionEvent.ACTION_CANCEL:     mConsumed = false;     mTouchDownX = mLastTouchX = mLastTouchY = 0;     if(-getScrollX()<getWidth()/2){ //偏移量不到屏幕寬度的一般,就回到最初的位置      scrollBack();     }else{      scrollFinish();     }     break;   }   return true;  } 

2)、滑動的偏移量超出屏幕的一辦,就關閉當前界面否則回到初始位置

/**  * 滑動到最初的位置  */  private void scrollBack() {   int startX = getScrollX();   int dx = -getScrollX();   mScroller.startScroll(startX, 0, dx, 0, 300);   invalidate();  }   /**  * 向右滑動關閉  */  private void scrollFinish(){   int dx = -getScrollX() - getWidth();   mScroller.startScroll(getScrollX(),0,dx,0,300);   invalidate();  } 

3)、我們可以將這些側滑處理放在我們的BaseActivity當中,需要側滑的Activity只要繼承這個BaseActivity并且主題設置成透明就可以了

@Override  protected void onCreate(@Nullable Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   if(enableRightSliding()){     SlidingLayout slidingLayout = new SlidingLayout(this);    slidingLayout.replaceCurrentLayout(this);   }   }   /**   * 子類重寫這個方法true:允許向右滑動,false:禁止向右滑動   * @return   */  protected boolean enableRightSliding(){   return false;  } 

源碼下載:仿ios側滑退出當前界面功能

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天门市| 大石桥市| 连云港市| 紫云| 玛多县| 镇远县| 杨浦区| 五家渠市| 从化市| 宾阳县| 南川市| 游戏| 穆棱市| 龙游县| 华安县| 寿阳县| 攀枝花市| 东港市| 理塘县| 宜阳县| 分宜县| 玉环县| 沽源县| 长乐市| 静乐县| 武汉市| 盈江县| 巩留县| 卢湾区| 冀州市| 长宁县| 寻乌县| 方山县| 和平县| 富锦市| 青岛市| 武鸣县| 彭泽县| 四平市| 盖州市| 海宁市|