Android仿iOS側(cè)滑退出當前界面功能
我們都知道在ios手機上面,有一個側(cè)滑退出當前界面的功能,但是在安卓手機上系統(tǒng)沒有給我們提供這樣的功能,但是這依然阻擋不了強大的安卓的定制功能,我們完全可以自己定制一套這樣的功能。
首先看下效果圖:
分析:
(1)要想模仿ios的這種效果,因為我們通過手指的滑動,所以這里肯定跟我們的滑動事件有關系(onInterceptTouchEvent,onTouchEvent這兩個方法的關系,如果不清楚,請直接查閱事件傳遞機制原理)
(2)我們要想直接攔截我們的所有觸摸事件,我們可以在上層父級布局中進行攔截和處理,這里我們想到了DecorView。首先我們應該知道Activity的頂級父View是DecorView,獲取我們的DecorView也很簡單
getWindow().getDecorView()
我們平時寫的那些xml布局文件都是包裹在這個DecorView中的,所以這里我們就有了一個思路:
我們可以在我們的xml布局和DecorView中間添加一個中間布局(SlidingLayout),然后所有的滑動邏輯和滑動沖突全部在這里面處理。
(3)比較關鍵的是:當我們需要使用側(cè)滑動能的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處理
/** * 根據(jù)手指移動的距離判斷是否攔截觸摸事件 * * @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: //抬起的時候重置參數(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) { //向左滑動的時候,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)、我們可以將這些側(cè)滑處理放在我們的BaseActivity當中,需要側(cè)滑的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側(cè)滑退出當前界面功能
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
android 添加按(power鍵)電源鍵結(jié)束通話(掛斷電話)
首先我們發(fā)現(xiàn)現(xiàn)在我們所用的android智能手機大部分都有當你在打電話時按power鍵來掛斷電話,一般都是在設置中2013-01-01Android Fragment的靜態(tài)注冊和動態(tài)注冊創(chuàng)建步驟
這篇文章主要介紹了Android Fragment的靜態(tài)注冊和動態(tài)注冊創(chuàng)建步驟,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02Android使用AudioManager修改系統(tǒng)音量的方法
這篇文章主要介紹了Android使用AudioManager修改系統(tǒng)音量的方法,結(jié)合實例形式分析了AudioManager調(diào)節(jié)音量的常用方法及相關使用技巧,需要的朋友可以參考下2016-08-08