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

首頁 > 系統(tǒng) > Android > 正文

Android仿iOS側(cè)滑退出當(dāng)前界面功能

2019-12-12 01:33:59
字體:
供稿:網(wǎng)友

我們都知道在ios手機(jī)上面,有一個(gè)側(cè)滑退出當(dāng)前界面的功能,但是在安卓手機(jī)上系統(tǒng)沒有給我們提供這樣的功能,但是這依然阻擋不了強(qiáng)大的安卓的定制功能,我們完全可以自己定制一套這樣的功能。

首先看下效果圖:

分析:

(1)要想模仿ios的這種效果,因?yàn)槲覀兺ㄟ^手指的滑動(dòng),所以這里肯定跟我們的滑動(dòng)事件有關(guān)系(onInterceptTouchEvent,onTouchEvent這兩個(gè)方法的關(guān)系,如果不清楚,請(qǐng)直接查閱事件傳遞機(jī)制原理)

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

getWindow().getDecorView() 

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

(3)比較關(guān)鍵的是:當(dāng)我們需要使用側(cè)滑動(dòng)能的Activity我們需要將它的主題設(shè)置成透明,這樣滑動(dòng)的時(shí)候就不會(huì)遮擋下面的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)當(dāng)我們滑動(dòng)超過半屏的時(shí)候,退出當(dāng)前界面,否則則回退到原始位置。這里使用Scroller

下面直接上代碼進(jìn)行分析:

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

/**  * 根據(jù)手指移動(dòng)的距離判斷是否攔截觸摸事件  *  * @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移動(dòng)的距離大于y移動(dòng)的距離,就攔截     if (mInterceptDownX < (getWidth() / 10) && Math.abs(moveX) > Math.abs(moveY)) {      mIntercept = true;     } else {      mIntercept = false;     }     mLastInterceptX = x;     mLastInterceptY = y;      break;    case MotionEvent.ACTION_UP: //抬起的時(shí)候重置參數(shù)     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) { //向左滑動(dòng)的時(shí)候,getScrollX()和rightMoveX都大于0,所以禁止滑動(dòng)       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)、滑動(dòng)的偏移量超出屏幕的一辦,就關(guān)閉當(dāng)前界面否則回到初始位置

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

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

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

源碼下載:仿ios側(cè)滑退出當(dāng)前界面功能

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 建水县| 维西| 塔城市| 铜山县| 墨江| 正阳县| 双流县| 米易县| 雷波县| 遂昌县| 聊城市| 岢岚县| 亚东县| 滦平县| 天门市| 沁源县| 长海县| 分宜县| 太原市| 清徐县| 葫芦岛市| 灵山县| 奇台县| 黎平县| 若羌县| 都江堰市| 财经| 罗平县| 金昌市| 伊川县| 芮城县| 贡觉县| 鄄城县| 淮滨县| 朝阳区| 盐山县| 万宁市| 鸡东县| 阿城市| 杂多县| 漳州市|