小編給大家分享一下Android中怎么實(shí)現(xiàn)仿iOS側(cè)滑退出當(dāng)前界面功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè),為客戶提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站、網(wǎng)頁設(shè)計開發(fā)服務(wù),多年建網(wǎng)站服務(wù)經(jīng)驗(yàn),各類網(wǎng)站都可以開發(fā),品牌網(wǎng)站建設(shè),公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設(shè)計,建網(wǎng)站費(fèi)用,建網(wǎng)站多少錢,價格優(yōu)惠,收費(fèi)合理。
首先看下效果圖:

分析:
(1)要想模仿ios的這種效果,因?yàn)槲覀兺ㄟ^手指的滑動,所以這里肯定跟我們的滑動事件有關(guān)系(onInterceptTouchEvent,onTouchEvent這兩個方法的關(guān)系,如果不清楚,請直接查閱事件傳遞機(jī)制原理)
(2)我們要想直接攔截我們的所有觸摸事件,我們可以在上層父級布局中進(jìn)行攔截和處理,這里我們想到了DecorView。首先我們應(yīng)該知道Activity的頂級父View是DecorView,獲取我們的DecorView也很簡單
getWindow().getDecorView()
我們平時寫的那些xml布局文件都是包裹在這個DecorView中的,所以這里我們就有了一個思路:
我們可以在我們的xml布局和DecorView中間添加一個中間布局(SlidingLayout),然后所有的滑動邏輯和滑動沖突全部在這里面處理。
(3)比較關(guān)鍵的是:當(dāng)我們需要使用側(cè)滑動能的Activity我們需要將它的主題設(shè)置成透明,這樣滑動的時候就不會遮擋下面的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)前界面,否則則回退到原始位置。這里使用Scroller
下面直接上代碼進(jìn)行分析:
1)、觸摸事件的處理過程,按下的位置大于X軸的十分之一就攔截當(dāng)前事件,交給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)、滑動的偏移量超出屏幕的一辦,就關(guān)閉當(dāng)前界面否則回到初始位置
/**
* 滑動到最初的位置
*/
private void scrollBack() {
int startX = getScrollX();
int dx = -getScrollX();
mScroller.startScroll(startX, 0, dx, 0, 300);
invalidate();
}
/**
* 向右滑動關(guān)閉
*/
private void scrollFinish(){
int dx = -getScrollX() - getWidth();
mScroller.startScroll(getScrollX(),0,dx,0,300);
invalidate();
}3)、我們可以將這些側(cè)滑處理放在我們的BaseActivity當(dāng)中,需要側(cè)滑的Activity只要繼承這個BaseActivity并且主題設(shè)置成透明就可以了
@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;
}以上是“Android中怎么實(shí)現(xiàn)仿iOS側(cè)滑退出當(dāng)前界面功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章標(biāo)題:Android中怎么實(shí)現(xiàn)仿iOS側(cè)滑退出當(dāng)前界面功能
網(wǎng)頁路徑:http://www.chinadenli.net/article22/gpdpjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、移動網(wǎng)站建設(shè)、定制網(wǎng)站、用戶體驗(yàn)、微信小程序、App設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)