用过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中的使用

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

千万不要忘了在子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)的更多相关文章

  1. iOS側拉栏抽屉效果Demo

    源代码下载 側拉栏抽屉效果Demo  须要导入第三方的类库例如以下: 抽屉效果所需第三方类库下载 效果:既能够两側都实现抽屉效果也可仅仅实现左側栏或者右側栏的抽屉效果           waterm ...

  2. 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 Stac ...

  3. Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 (主要是NSLayoutConstraint 的使用)

    当前位置: > Swift新手入门 > Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 时间:2014-09-10 16:49来源:未知 作者:啊成 举报 点击:5 ...

  4. iOS开发中文件的上传和下载功能的基本实现-备用

    感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...

  5. iOS Dev (20) 用 AVAudioPlayer 播放一个本地音频文件

    iOS Dev (20) 用 AVAudioPlayer 播放一个本地音频文件 作者:CSDN 大锐哥 博客:http://blog.csdn.net/prevention 步骤 第一步:在 Proj ...

  6. iOS Dev (21) 用 AVPlayer 播放一个本地音频文件

    iOS Dev (21) 用 AVPlayer 播放一个本地音频文件 作者:CSDN 大锐哥 博客:http://blog.csdn.net/prevention 前言 这篇文章与上一篇极其相似,要注 ...

  7. mui 列表项左右滑删除功能升级(仿微信左滑 点击删除后出现确认删除)

    mui 列表项左右滑删除功能升级(仿微信左滑 点击删除后出现确认删除) 2018-06-19更新显示样式

  8. iOS 添加第三方.framework 打包上传iTunesConnect 遇到的坑

    1.添加完第三方库,模拟器运行没事,打iOS通用设备包的时候报一个错. ld: '/Users/jiangwei.wang/Documents/Project/APP NAME/SeosMobileK ...

  9. 转 如何在IOS设备中去掉屏幕上的status bar

    引入如何在IOS设备中去掉屏幕上的status bar,即:不显示设备上方的[网络.时间.电池??]条?操作方法一:在-info.list项目文件中,加上“Status bar is initiall ...

随机推荐

  1. 基于webpack搭建的vue+element-ui框架

    花了1天多的时间, 终于把这个框架搭建起来了. 好了, 不多说了, 直接进入主题了.前提是安装了nodejs,至于怎么安装, 网上都有教程. 这里就不多说了, 这边使用的IDE是idea.1.在E:/ ...

  2. C#使用Oracle.ManagedDataAccess.dll

    在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了.在那时没有ODP.NET,但visual studio却对Oralce数据库的调用 ...

  3. netty常用使用方式

    最近在重新看netty,在这里总结一些netty的一些常用的使用方式,类似于模板,方便速查. 以netty 4.1.x的API作记录,不同版本可能API有略微差异,需要注意netty5被废弃掉了(辨别 ...

  4. Nginx服务及编译安装

    第1章 Nginx 1.1 nginx的概念 Nginx("engine x")是一个开源的.支持高性能.高并发的WWW服务和代理服务软件,具有高开发(特别是静态资源),占用系统资 ...

  5. VUE父子组件传值问题

    一.父组件向子组件传递数据 组件实例的作用域是孤立的.这意味着不能(也不应该)在子组件的模板内直接引用父组件的数据.要让子组件使用父组件的数据,我们需要通过子组件的props选项. 1.静态props ...

  6. 解决autocad闪退

    1.进入注册表,regedit 2.找到ROOT\installer\Products ,找到以7D2F开头的键值,这里有两个都得删除 3.删除programdata目录下的AutoDesk目录,及f ...

  7. 结合java.util.TreeMap源码理解红黑树

    前言 本篇将结合JDK1.6的TreeMap源码,来一起探索红-黑树的奥秘.红黑树是解决二叉搜索树的非平衡问题. 当插入(或者删除)一个新节点时,为了使树保持平衡,必须遵循一定的规则,这个规则就是红- ...

  8. ButterKnife的使用以及不能自动生成代码问题的解决

    ButterKnife的使用以及不能自动生成代码问题的解决 转载请注明出处:http://www.cnblogs.com/zhengjunfei/p/5910497.html 最近换了个工作刚入职,又 ...

  9. 【Java框架型项目从入门到装逼】第一节 - Spring框架 IOC的丧心病狂解说

    大家好,好久不见,今天我们来一起学习一下关于Spring框架的IOC技术. 控制反转--Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的 ...

  10. Mysql的学习笔记(一)--检验数据库是否安装成功以及一些入门的简单的dos命令

    一:如何检验数据库是否安装成功: 1:以管理员的身份打开命令提示符,具体如何用管理员的身份打开请参考下面 https://jingyan.baidu.com/article/e73e26c0f87c2 ...