給你的頁面帶上側(cè)滑返回——SlideBack

簡介

這個小東西是我很早之前寫的,功能就是可以給你的頁面帶上滑動返回。開始的時候沒在意,后來發(fā)現(xiàn)star的人還不少...

于是我決定完善完善,然后寫個博客介紹介紹...

GitHub地址:SlideBack

效果如下:

示例

使用方法

Step 1. 在你項目的根build.gradle中添加jitpack.io庫

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

Step 2. 添加SlideBack的依賴

dependencies {
    implementation 'com.github.ChenTianSaber:SlideBack:v0.8.1'
}

Step 3. 將項目中繼承的Activity換成SlideBackActivity

public class YourActivity extends SlideBackActivity

Step 4. 你可以在onCreate方法中調(diào)用setSlideBackDirection,可以給每一個Activity單獨配置,如果沒有配置這個,那么默認是 SlideBackActivity.ALL

protected void onCreate(Bundle savedInstanceState) {
    //Other Code...

    //有三個值可以設(shè)置
    //SlideBackActivity.RIGHT  表示只能從屏幕右側(cè)滑出
    //SlideBackActivity.LEFT  表示只能從屏幕左側(cè)滑出
    //SlideBackActivity.ALL  表示從屏幕兩邊都可以滑出
    setSlideBackDirection(SlideBackActivity.RIGHT);
}

Step 5. 重寫slideBackSuccess(當(dāng)滑動有效時會回調(diào)這個方法,可以在這里進行回退操作或其他)

@Override
protected void slideBackSuccess() {
   finish();//或者其他
}

實現(xiàn)原理

原理很簡單,具體的大家可以上GitHub看源碼,沒幾行代碼,很短噠

至于這篇文章里,我就簡單的講一下好了:

Step 1.首先我們畫一個自定義view,就是你從屏幕邊緣拉出來的那個東西,我們將其稱為 側(cè)滑View 好了

側(cè)滑View

這個View只有一個可變的參數(shù),就是View的寬度。其余所有的坐標(biāo)都是根據(jù)這個寬度來計算的,于是我們只要改變這個寬度就可以做出一種動畫的效果

Step 2.然后我們獲取DecorView,并將上面的這個側(cè)滑View添加進去,關(guān)鍵代碼如下:

FrameLayout container = (FrameLayout) getWindow().getDecorView();
containerView = LayoutInflater.from(this).inflate(R.layout.chentian_view_slide_container, null);
slideContainerView = containerView.findViewById(R.id.slide_container);
slideContainerView.addView(backView);
container.addView(slideContainerView);

Step 3.最后一步就是監(jiān)聽DecorView的Touch事件,來判斷滑動的區(qū)域以及滑動距離來設(shè)置側(cè)滑View的參數(shù),關(guān)鍵代碼如下:

slideContainerView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {

        x = Math.abs(screenWidth * offset - motionEvent.getRawX());
        y = motionEvent.getRawY();

        switch (motionEvent.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downX = motionEvent.getRawX();

                //判斷點擊范圍與設(shè)置的滑出區(qū)域是否符合
                if (SLIDEBACK_DIRECTION == LEFT) {
                    if (downX > screenWidth / 2) {
                        //在右側(cè)區(qū)域,直接return
                        return false;
                    } else {
                        offset = 0;
                    }
                } else if (SLIDEBACK_DIRECTION == RIGHT) {
                    if (downX < screenWidth / 2) {
                        //在左側(cè)區(qū)域,直接return
                        return false;
                    } else {
                        offset = 1;
                    }
                } else if (SLIDEBACK_DIRECTION == ALL) {
                    if (downX > screenWidth / 2) {
                        //在右側(cè)區(qū)域,設(shè)為RIGHT
                        offset = 1;
                    } else if (downX < screenWidth / 2) {
                        //在左側(cè)區(qū)域,設(shè)為LEFT
                        offset = 0;
                    }
                }

                x = Math.abs(screenWidth * offset - motionEvent.getRawX());

                if (x <= dp2px(CANSLIDE_LENGTH)) {
                    isEage = true;
                    slideBackView.updateControlPoint(Math.abs(x), offset);
                    setBackViewY(backView, (int) (motionEvent.getRawY()));
                }
                break;

            case MotionEvent.ACTION_MOVE:
                float moveX = Math.abs(screenWidth * offset - x) - downX;
                if (isEage) {
                    if (Math.abs(moveX) <= shouldFinishPix) {
                        slideBackView.updateControlPoint(Math.abs(moveX) / 2, offset);
                    }
                    setBackViewY(backView, (int) (motionEvent.getRawY()));
                }
                break;

            case MotionEvent.ACTION_UP:
                //從左邊緣劃過來,并且最后在屏幕的三分之一外
                if (isEage) {
                    if (x >= shouldFinishPix) {
                        slideBackSuccess();
                    }
                }
                isEage = false;
                slideBackView.updateControlPoint(0, offset);
                break;
        }
        if (isEage) {
            return true;
        } else {
            return false;
        }
    }
});

大概的步驟就是這樣子...

總結(jié)

大家有什么疑問或者建議都可以在下面評論告訴我,或者上GitHub上提issue,謝謝大家,祝大家新年快樂~

相逢是緣...請大家順手給我個Star唄...謝謝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容