给你的页面带上侧滑返回——SlideBack

栏目: IOS · Android · 发布时间: 5年前

内容简介:这个小东西是我很早之前写的,功能就是可以给你的页面带上滑动返回。开始的时候没在意,后来发现star的人还不少...于是我决定完善完善,然后写个博客介绍介绍...GitHub地址:

这个小东西是我很早之前写的,功能就是可以给你的页面带上滑动返回。开始的时候没在意,后来发现star的人还不少...

于是我决定完善完善,然后写个博客介绍介绍...

GitHub地址: SlideBack

效果如下:

给你的页面带上侧滑返回——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方法中调用setSlideBackDirection,可以给每一个Activity单独配置,如果没有配置这个,那么默认是 SlideBackActivity.ALL

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

    //有三个值可以设置
    //SlideBackActivity.RIGHT  表示只能从屏幕右侧滑出
    //SlideBackActivity.LEFT  表示只能从屏幕左侧滑出
    //SlideBackActivity.ALL  表示从屏幕两边都可以滑出
    setSlideBackDirection(SlideBackActivity.RIGHT);
}
复制代码

Step 5. 重写slideBackSuccess(当滑动有效时会回调这个方法,可以在这里进行回退操作或其他)

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

实现原理

原理很简单,具体的大家可以上GitHub看源码,没几行代码,很短哒

至于这篇文章里,我就简单的讲一下好了:

Step 1.首先我们画一个自定义view,就是你从屏幕边缘拉出来的那个东西,我们将其称为 侧滑View 好了

给你的页面带上侧滑返回——SlideBack

这个View只有一个可变的参数,就是View的宽度。其余所有的坐标都是根据这个宽度来计算的,于是我们只要改变这个宽度就可以做出一种动画的效果

Step 2.然后我们获取DecorView,并将上面的这个侧滑View添加进去,关键代码如下:

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.最后一步就是监听DecorView的Touch事件,来判断滑动的区域以及滑动距离来设置侧滑View的参数,关键代码如下:

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();

                //判断点击范围与设置的滑出区域是否符合
                if (SLIDEBACK_DIRECTION == LEFT) {
                    if (downX > screenWidth / 2) {
                        //在右侧区域,直接return
                        return false;
                    } else {
                        offset = 0;
                    }
                } else if (SLIDEBACK_DIRECTION == RIGHT) {
                    if (downX < screenWidth / 2) {
                        //在左侧区域,直接return
                        return false;
                    } else {
                        offset = 1;
                    }
                } else if (SLIDEBACK_DIRECTION == ALL) {
                    if (downX > screenWidth / 2) {
                        //在右侧区域,设为RIGHT
                        offset = 1;
                    } else if (downX < screenWidth / 2) {
                        //在左侧区域,设为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;
        }
    }
});
复制代码

大概的步骤就是这样子...


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

可计算性和计算复杂性

可计算性和计算复杂性

朱一清 / 国防工业出版社 / 2006-4 / 18.0

本书深入浅出地介绍了研究可计算性的四个主要模型以及四个模型彼此之间的关系:介绍了计算复杂性的基本概念和重要的研究方法与一些研究成果。内容涉及递归函数、图灵机、λ演算、马尔可夫算法、计算复杂度的分类、NP完全理论、非一致复杂性等。分述于十章,书中附有习题。 本书可作为广大有志于突破计算复杂性研究僵局——“P=NP?”的科技工作者,计算机科学和元计算机科学工作者,数学和元数学工作者以及大......一起来看看 《可计算性和计算复杂性》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码