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

 更新时间:2017年12月02日 14:28:23   作者:彼岸人生  
这篇文章主要为大家详细介绍了Android仿iOS侧滑退出当前界面功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

首先看下效果图:

分析:

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

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

getWindow().getDecorView() 

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

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

<style name="AppTheme.Slide" parent="@style/AppTheme"> 
  <!--Required--> 
  <item name="android:windowBackground">@android:color/transparent</item> 
  <item name="android:windowIsTranslucent">true</item> 
  <item name="android:windowAnimationStyle">@style/AppTheme.Slide.Animation</item> 
 </style> 

(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()<getWidth()/2){ //偏移量不到屏幕宽度的一般,就回到最初的位置 
     scrollBack(); 
    }else{ 
     scrollFinish(); 
    } 
    break; 
   case MotionEvent.ACTION_CANCEL: 
    mConsumed = false; 
    mTouchDownX = mLastTouchX = mLastTouchY = 0; 
    if(-getScrollX()<getWidth()/2){ //偏移量不到屏幕宽度的一般,就回到最初的位置 
     scrollBack(); 
    }else{ 
     scrollFinish(); 
    } 
    break; 
  } 
  return true; 
 } 

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 百分比布局详解及实例代码

    这篇文章主要介绍了Android 百分比布局详解及实例代码的相关资料,这里附有代码实例帮助大家学习参考,如何实现百分比布局,需要的朋友可以参考下
    2016-11-11
  • android 添加按(power键)电源键结束通话(挂断电话)

    android 添加按(power键)电源键结束通话(挂断电话)

    首先我们发现现在我们所用的android智能手机大部分都有当你在打电话时按power键来挂断电话,一般都是在设置中
    2013-01-01
  • Kotlin lambda表达式入门指南

    Kotlin lambda表达式入门指南

    在kotlin当中,Lambda表达式是最高等级的,Lambda表达式可以理解为一种匿名函数,是一种高效的类似于函数式编程的表达式,本文介绍Kotlin lambda表达式入门指南,感兴趣的朋友一起看看吧
    2024-03-03
  • Android 仿今日头条简单的刷新效果实例代码

    Android 仿今日头条简单的刷新效果实例代码

    这篇文章主要介绍了Android 仿今日头条简单的刷新效果实例代码的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • Android Fragment的静态注册和动态注册创建步骤

    Android Fragment的静态注册和动态注册创建步骤

    这篇文章主要介绍了Android Fragment的静态注册和动态注册创建步骤,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Android 7.0 Nougat不得不知的11项新功能

    Android 7.0 Nougat不得不知的11项新功能

    不得不知的11项Android 7.0 Nougat新功能,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android实现分享功能

    Android实现分享功能

    如何在Android中实现分享功能?这篇文章主要为大家详细介绍了Android实现分享功能的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android Activity打开后被应用快照遮住的问题

    Android Activity打开后被应用快照遮住的问题

    这篇文章主要介绍了Android Activity打开后被应用快照遮住的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Android中正确使用字体图标(iconfont)的方法

    Android中正确使用字体图标(iconfont)的方法

    IconFont字体不仅仅流行于Web开发,在移动开发中也渐渐的使用的范围更广泛。这篇文章主要介绍了在Android开发中使用icon font的代码和方法。对大家学习使用iconfont有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
    2016-10-10
  • Android使用AudioManager修改系统音量的方法

    Android使用AudioManager修改系统音量的方法

    这篇文章主要介绍了Android使用AudioManager修改系统音量的方法,结合实例形式分析了AudioManager调节音量的常用方法及相关使用技巧,需要的朋友可以参考下
    2016-08-08

最新评论