侧滑回退的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

时间: 2024-08-02 18:14:12

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

类似IOS的滑动返回上一级,SwipeBackLayout-android的滑动返回类库

     最近,公司在开发App的需求中增加了一个新的需求,要在android的页面中增加向右滑动的时候返回上一级页面.我刚知道这个需求的时候,感觉有点坑,可能设计那边最近接触到知乎的客户端或者是IOS的滑动可以返回上一级的效果,所以...     之前没有接触过android的滑动返回的开源库,所以还是找一下百度...    后来在Github上找到了SwipeBackLayout:GitHub地址是:https://github.com/ikew0ng/SwipeBackLayout   

Android UI之自定义——类似iOS的Tabbar

Android UI之自定义--类似iOS的Tabbar Tabbar最早出现在iOS,iOS中的TabBarController实现了这个功能,开发起来相当简单.现在的APP,大多数都会使用Tabbar来作为应用的功能导航,界面简单清晰.那么Android常见的实现是通过RadioGroup来实现,今天将带来自定义实现,补充RadioGroup实现的不足. 先看看常见的软件中的使用: 这个是高铁管家APP,大家应该非常熟悉.这个APP的首页底部就是一个类似iOS的Tabbar.这里就不多举例子

Cocos2d-x3.1下实现类似iOS页面滑动指示圆点

原文地址:http://blog.csdn.net/qqmcy/article/details/37612457 代码下载:http://download.csdn.net/detail/qqmcy/7613835 SliderIndicatorLayout.h // // SliderIndicatorLayout.h // ht_mobile_cpp // // Created by 杜甲 on 14-7-9. // // #ifndef __ht_mobile_cpp__SliderInd

iOS 7 - Auto Layout on iOS Versions prior to 6.0

链接地址:http://stackoverflow.com/questions/18735847/ios-7-auto-layout-on-ios-versions-prior-to-6-0 Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required. iOS 7 - Auto Layout on

Windows Phone中使用Storyboard做类似 IOS 屏幕小白点的效果

windows phone中做动画其实很方便的,可以使用Blend拖来拖去就做出一个简单的动画,下面做了一个 ios屏幕小白点的拖动效果,包括速度判断移动 使用Blend生成以下代码 <Storyboard x:Name="HandFunGTLSb"><!-- 向左滑动时动画 --> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransfo

Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果

目前Android的实现是:有来电时,音乐声音直接停止,铃声直接直接使用设置的铃声音量进行铃声播放. Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果. 如果要实现这个效果,首先要搞清楚两大问题: 1.来电时的代码主要实现流程. 2.主流音乐播放器在播放过程中,如果有来电,到底在收到了什么事件后将音乐暂停了? 一:来电时的代码主要实现流程 我不是第一研究来电代码的人,网上已经有高手对这个流程剖析过,不是不完全符合我的要求,我参考过的比较有价值的是如下两个

iOS自定义控件教程:制作一个可重用的旋钮

当你的APP需要一些新功能时,自定义UI控件会十分有用,尤其是这些自定义控件可以在其他APP里面很好的重用.Colin Eberhart写过一篇很棒的介绍自定义UI控件的教程.这个教程涉及的是一个继承自UISlider类的自定义控件的生成:该控件的功能是给定一个(滑动)范围供(用户滑动)选择,并返回一个(与滑动位置相对应的)固定值. 本篇基于iOS 7的自定义UI教程在Colin Eberhart那篇的基础上更深入一步:受调音台旋钮的启发,这里介绍如何制作一个功能类似UISlider的圆形旋转控

IOS开发之文件上传

IOS开发之文件上传 在移动应用开发  文件形式上传是必不可少的,最近把IOS这块文件上传文件代码简单的整理一下,如果大家有需要安卓这边的代码,本人也可以分享给大家!QQ群:74432915  欢迎大家一起探讨 首先本demo采用网上开源框架 AFNetworking  源码:http://download.csdn.net/detail/wangliang198901/7809439 将整个框架导入IOS新建立的工程中 在FKAppDelegate.h声明 如下: #import <UIKit

iOS 运行时ScrollView上出现空白空间-解决方案

iOS7 中的UIViewControllers设置了automaticallyAdjustsScrollViewInsets.如果是YES,scrollview会根据status bar, navigation bar以及tool bar或者tab bar的高度自动调整.可以通过在storyboard的右侧进行设置,在Attributes Inspector中,不勾选"Adjust Scroll View Insets". 翻译自: http://stackoverflow.com/