用过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. Jumpserver部署与安装

    jumpserver特点: 完全开源,GPL授权 Python编写,容易再次开发 实现了跳板机基本功能,认证.授权.审计 集成了Ansible,批量命令等 支持WebTerminal Bootstra ...

  2. MVC 小案例 -- 信息管理

    前几次更新博客都是每次周日晚上到周一,这次是周一晚上开始写,肯定也是有原因的!那就是我的 Tomact 忽然报错,无法启动,错误信息如下!同时我的 win10 也崩了,重启之后连 WIFI 的标志也不 ...

  3. Drools文档(六) 用户手册

    用户手册 基础 无状态的知识Session Drools规则引擎拥有大量的用例和功能,我们要如何开始?你无须担心,这些复杂性是分层的,你可以用简单的用例来逐步入门. 无状态Session,无须使用推理 ...

  4. 利用bootstrap写的一点本地(localStorage)储存

    摘要: H5本地存储 在以前,我们想要存储一些数据,并且只是在前端使用,服务端并不会使用,我们只能存在cookie里,但是cookie会跟随请求头在客户端和服务端之间来回传递,而且cookie还有一些 ...

  5. RedHat升级Python到2.7.6

    今天本来想研究一下Python  paramiko模块,安装安装 paramiko-1.10.1.tar.gz的时候报错,!看了一下虚拟机RedHat中的python,发现还是原生的2.4.3,所以决 ...

  6. 认识 Less

    CSS(层叠样式表)是一项出色的技术,它使得网页的表现与内容完全分离,使网站维护工作变得更容易,不会因为内容的改变而影响表现,也不会因为表现的改变而影响内容. 作为一门标记性语言,CSS 的先天性优点 ...

  7. [flask/python/web] 解析flask web开发(Miguel著)一书第11章主页不显示博文表单的问题

    ---------------------------------------------以下内容2017.7.14更新---------------------------------------- ...

  8. 爬起点小说 day01

    先介绍下我自己爬起点小说的思路: 1.爬取所有的类型列表 a.链接存redis中 类型表:novel_list 具体每一种类型:bnovel_all_list(把novel_list和bnovel_l ...

  9. VSCode 同步设置及扩展插件 实现设备上设置统一

    准备工作:电脑上需安装VSCode,拥有一个github账户.实现同步的功能主要依赖于VSCode插件 "Settings Sync" Setting Sync 可同步包含的所有扩 ...

  10. js脚本根据身份证号获取性别、年龄、家庭地址、生日

    做项目测试时需要根据身份证号获取其信息,也不想调接口,就自己在本地通过收集资料整合了一个