侧滑回退的layout(类似IOS侧滑回退到上一个activity)

Posted Ray幸福的生活

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了侧滑回退的layout(类似IOS侧滑回退到上一个activity)相关的知识,希望对你有一定的参考价值。

        用过apple的同学应该都知道,大多数ios应用都支持侧滑回退,就不详细说明了,直接上图:

技术分享

作为使用ios的android开发者来说,我是特别喜欢这个功能的,既然这样,那就在android上也实现这个功能吧。

构思:

1、要处理滑动事件,而且优先级比较高,所以必须在父View中处理,也就是我们layout中的顶级View(当然这里说的顶级View不是DecorView,仅仅是layout里面的第一层View),一般是ViewGroup。

2、既然是ViewGroup,我们得思考下,这个滑动事件我们是在哪个方法里处理,有同学说了,onTouchEvent(),OK,我们再分析下,假如我们在onTouchEvent()中处理,由view的事件分发我们可以知道:

技术分享

我们知道了这个循序以后,所以我们得选择优先处理事件的方法,这个就可以从onInterceptTouchEvent()和dispatchTouchEvent()中选,这里我选择了dispatchTouchEvent(),为什么,我也不知道...

3、实现原理

     只有横向滑动才处理,并且,只有从边缘滑动才能触发此事件,其实这就简单了,直接上代码。

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startX = event.getX();
                //判断是否是从边缘滑动
                //不是,此事件继续向下分发
                if (startX <= OFFSET_DISTANCE) {
                    return true;
                } else {
                    super.dispatchTouchEvent(event);
                }

            case MotionEvent.ACTION_MOVE:
                if (startX <= OFFSET_DISTANCE) {
                    currentX = (int) event.getX();
                    distanceX = (int) (currentX - startX);
                    mScroller.startScroll(-currentX, 0, -distanceX, 0);
                    invalidate();
                }
                break;
            case MotionEvent.ACTION_UP:
                if (startX <= OFFSET_DISTANCE) {
                    endX = event.getX();
                    //判断是否到达关闭activity的阀值
                    if (endX - startX > BACK_DISTANCE) {
                        //是 通过接口回调
                        if (callback != null) {
                            mScroller.startScroll(-currentX, 0, -(getScreentWidth() - currentX), 0);
                            callback.invokeBack();
                        } else {
                            mScroller.startScroll(0, 0, 0, 0);
                        }

                    } else {
                        mScroller.startScroll(0, 0, 0, 0);
                    }
                    invalidate();
                }
                break;

        }
        return super.dispatchTouchEvent(event);
    }
<pre name="code" class="java">    public void setBackListener(BackViewInterface callback) {
        this.callback = callback;
    }

    public interface BackViewInterface {
        void invokeBack();
    }



使用方式:

1、在BaseActivity中实现接口

技术分享

技术分享

2、在子activity中的使用

技术分享

千万不要忘了在子activity中注册接口

技术分享

3 、特别注意

由于我们仅仅是滑动的View而在上面提到的真正的顶级view还是没动,没动会带来什么问题呢,虽然栈顶activity的View滑动了,但是滑动的背后是全白的,这个就是真正顶级View的背景色,所以说到这里,大家知道该怎么做了吧?把Activity主题设置成透明的就ok啦,但是注意要把layout的背景设置成白色。

技术分享


大功告成啦,上图:

技术分享


下次有时间给大家分享一个悬浮效果的简单案例:

技术分享


详情可以关注https://github.com/ray0807


https://github.com/ray0807/ShareFramework/blob/master/balloon/simplifyCorelibs/src/main/java/com/corelibs/views/SplideBackLinearLayout.java


















以上是关于侧滑回退的layout(类似IOS侧滑回退到上一个activity)的主要内容,如果未能解决你的问题,请参考以下文章

侧滑回退的layout(类似IOS侧滑回退到上一个activity)

git_04_回退到上个版本

突击Mercurial SCM(HG)13---回退到指定版本

git 如何让远程分支版本回退

git回退到某个版本并提交

activiti5 流程里面怎么回退到上一个节点