这个小东西是我很早以前写的,功能就是能够给你的页面带上滑动返回。开始的时候没在乎,后来发现star的人还很多...git
因而我决定完善完善,而后写个博客介绍介绍...github
GitHub地址:SlideBackbash
效果以下:maven
Step 1. 在你项目的根build.gradle中添加jitpack.io库ide
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
复制代码
Step 2. 添加SlideBack的依赖gradle
dependencies {
implementation 'com.github.ChenTianSaber:SlideBack:v0.8.1'
}
复制代码
Step 3. 将项目中继承的Activity换成SlideBackActivity动画
public class YourActivity extends SlideBackActivity
复制代码
Step 4. 你能够在onCreate方法中调用setSlideBackDirection,能够给每个Activity单独配置,若是没有配置这个,那么默认是 SlideBackActivity.ALLui
protected void onCreate(Bundle savedInstanceState) {
//Other Code...
//有三个值能够设置
//SlideBackActivity.RIGHT 表示只能从屏幕右侧滑出
//SlideBackActivity.LEFT 表示只能从屏幕左侧滑出
//SlideBackActivity.ALL 表示从屏幕两边均可以滑出
setSlideBackDirection(SlideBackActivity.RIGHT);
}
复制代码
Step 5. 重写slideBackSuccess(当滑动有效时会回调这个方法,能够在这里进行回退操做或其余)this
@Override
protected void slideBackSuccess() {
finish();//或者其余
}
复制代码
原理很简单,具体的你们能够上GitHub看源码,没几行代码,很短哒url
至于这篇文章里,我就简单的讲一下好了:
Step 1.首先咱们画一个自定义view,就是你从屏幕边缘拉出来的那个东西,咱们将其称为 侧滑View 好了
这个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;
}
}
});
复制代码
大概的步骤就是这样子...
你们有什么疑问或者建议均可以在下面评论告诉我,或者上GitHub上提issue,谢谢你们,祝你们新年快乐~