热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android仿iOS侧滑退出当前界面功能

这篇文章主要为大家详细介绍了Android仿iOS侧滑退出当前界面功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

我们都知道在ios手机上面,有一个侧滑退出当前界面的功能,但是在安卓手机上系统没有给我们提供这样的功能,但是这依然阻挡不了强大的安卓的定制功能,我们完全可以自己定制一套这样的功能。

首先看下效果图:

分析:

(1)要想模仿ios的这种效果,因为我们通过手指的滑动,所以这里肯定跟我们的滑动事件有关系(onInterceptTouchEvent,onTouchEvent这两个方法的关系,如果不清楚,请直接查阅事件传递机制原理)

(2)我们要想直接拦截我们的所有触摸事件,我们可以在上层父级布局中进行拦截和处理,这里我们想到了DecorView。首先我们应该知道Activity的顶级父View是DecorView,获取我们的DecorView也很简单

getWindow().getDecorView() 

我们平时写的那些xml布局文件都是包裹在这个DecorView中的,所以这里我们就有了一个思路:
我们可以在我们的xml布局和DecorView中间添加一个中间布局(SlidingLayout),然后所有的滑动逻辑和滑动冲突全部在这里面处理。

(3)比较关键的是:当我们需要使用侧滑动能的Activity我们需要将它的主题设置成透明,这样滑动的时候就不会遮挡下面的Activity,代码如下:

 

(4)当我们滑动超过半屏的时候,退出当前界面,否则则回退到原始位置。这里使用Scroller

下面直接上代码进行分析:

1)、触摸事件的处理过程,按下的位置大于X轴的十分之一就拦截当前事件,交给SlidingLayout的onTouchEvent处理

/** 
 * 根据手指移动的距离判断是否拦截触摸事件 
 * 
 * @param ev 
 * @return 
 */ 
 @Override 
 public boolean onInterceptTouchEvent(MotionEvent ev) { 
 
  int x = (int) ev.getX(); 
  int y = (int) ev.getY(); 
  boolean mIntercept = false; 
  switch (ev.getAction()) { 
   case MotionEvent.ACTION_DOWN: 
 
    mInterceptDownX = x; 
    mLastInterceptX = x; 
    mLastInterceptY = y; 
    break; 
   case MotionEvent.ACTION_MOVE: 
 
    int moveX = x - mLastInterceptX; 
    int moveY = y - mLastInterceptY; 
    //按下的位置的X位置小于屏幕的十分之一,并且x移动的距离大于y移动的距离,就拦截 
    if (mInterceptDownX <(getWidth() / 10) && Math.abs(moveX) > Math.abs(moveY)) { 
     mIntercept = true; 
    } else { 
     mIntercept = false; 
    } 
    mLastInterceptX = x; 
    mLastInterceptY = y; 
 
    break; 
   case MotionEvent.ACTION_UP: //抬起的时候重置参数 
    mIntercept = false; 
    mInterceptDownX = mLastInterceptX = mLastInterceptY = 0; 
    break; 
  } 
  return mIntercept; 
 } 
 
 private int mTouchDownX; 
 private int mLastTouchX; 
 private int mLastTouchY; 
 
 @Override 
 public boolean onTouchEvent(MotionEvent event) { 
 
  boolean mCOnsumed= false; 
  int x = (int) event.getX(); 
  int y = (int) event.getY(); 
  switch (event.getAction()) { 
   case MotionEvent.ACTION_DOWN: 
 
    mTouchDownX = x; 
    mLastTouchX = x; 
    mLastTouchY = y; 
    break; 
   case MotionEvent.ACTION_MOVE: 
 
    int moveX = x - mLastTouchX; 
    int moveY = y - mLastTouchY; 
    if (mTouchDownX <(getWidth() / 10) && Math.abs(moveX) > Math.abs(moveY) && !mConsumed) { 
     mCOnsumed= true; 
    } 
    if (mConsumed) { 
     int rightMoveX = (int) (mLastTouchX - event.getX()); 
     if ((getScrollX() + rightMoveX) > 0) { //向左滑动的时候,getScrollX()和rightMoveX都大于0,所以禁止滑动 
      scrollTo(0, 0); 
     } else { 
      scrollBy(rightMoveX, 0); 
     } 
    } 
    mLastTouchX = x; 
    mLastTouchY = y; 
    break; 
   case MotionEvent.ACTION_UP: 
 
    mCOnsumed= false; 
    mTouchDownX = mLastTouchX = mLastTouchY = 0; 
    if(-getScrollX()

2)、滑动的偏移量超出屏幕的一办,就关闭当前界面否则回到初始位置

/** 
 * 滑动到最初的位置 
 */ 
 private void scrollBack() { 
  int startX = getScrollX(); 
  int dx = -getScrollX(); 
  mScroller.startScroll(startX, 0, dx, 0, 300); 
  invalidate(); 
 } 
 
 /** 
 * 向右滑动关闭 
 */ 
 private void scrollFinish(){ 
  int dx = -getScrollX() - getWidth(); 
  mScroller.startScroll(getScrollX(),0,dx,0,300); 
  invalidate(); 
 } 

3)、我们可以将这些侧滑处理放在我们的BaseActivity当中,需要侧滑的Activity只要继承这个BaseActivity并且主题设置成透明就可以了

@Override 
 protected void onCreate(@Nullable Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  if(enableRightSliding()){ 
 
   SlidingLayout slidingLayout = new SlidingLayout(this); 
   slidingLayout.replaceCurrentLayout(this); 
  } 
 
 } 
 
 /** 
  * 子类重写这个方法true:允许向右滑动,false:禁止向右滑动 
  * @return 
  */ 
 protected boolean enableRightSliding(){ 
  return false; 
 } 

源码下载:仿ios侧滑退出当前界面功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
author-avatar
爵士独舞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有