zoukankan      html  css  js  c++  java
  • 側滑回退的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


  • 相关阅读:
    [Android 4.4.4] 泛泰A850 三版通刷 Mokee4.4.4 KTU84P 20140626 RC2.2 by syhost
    YUV12(420) (from)to RGB24
    Python图像处理(16):图像金字塔
    内存管理笔记(分页,分段,逻辑地址,物理地址)【转】
    Linux内核分析--内核中的数据结构双向链表【转】
    标准IO与文件IO 的区别【转】
    Linux中设备号及设备文件【转】
    静态编译和动态编译的区别【转】
    嵌入式系统 Boot Loader 技术内幕【转】
    理解 Linux 的硬链接与软链接【转】
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7279525.html
Copyright © 2011-2022 走看看