Android仿iOS实现侧滑返回功能(类似微信)

 更新时间:2017年12月02日 14:21:43   作者:陈铭卓  
这篇文章主要为大家详细介绍了Android仿iOS实现侧滑返回功能,类似微信功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

我们都知道侧滑返回操作是 iOS 里面比较常见的功能,一般是手指在靠近手机屏幕左边缘向右滑动就可以关闭当前的界面,iOS 系统提供了这样的 API,但是 Android 怎么实现呢?网上找了许多方法,比较了一下,个人觉得还是这个比较方便也容易理解,

先上个效果再说:

原理

Activity 本身是不可以滑动的,但是我们可以制造一个正在滑动 Activity 的假象,使得看起来这个 Activity 正在被手指滑动。其原理其实很简单,我们滑动的其实是 Activity 里面的可见View元素,而我们将 Activity 设置为透明的,这样当 View 滑过的时候,由于 Activity 的底部是透明的,我们就可以在滑动过程中看到下面的Activity,这样看起来就是在滑动 Activity。所以 Activity 滑动效果分两步:

设置 Activity 透明
滑动 View

实现

1、设置透明:

资源文件 values -> styles.xml 添加如下代码,搞一个透明的主题。

<style name="Transparent" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="android:windowBackground">@android:color/transparent</item>
  <item name="android:windowIsTranslucent">true</item>
</style>

然后在 AndroidManifest.xml 文件里面给相应的 Activity 设置透明的主题。比如 MainActivity :

<activity
  android:name="com.example.test.MainActivity"
  android:theme="@style/Transparent" >
</activity>

2、滑动View:

先看看 Activity 的层次结构:我们用的 Activity 的 xml 的根 View 并不是 Activity 的根 View ,在它上面还有一个父 View, id 是 android.R.id.content,再向上一层,还有一个view,它是一个 LinearLayout,它除了放置我们创建的 View 之外,还放置我们的 xml 之外的一些东西比如放 ActionBar 或者标题栏什么的。而再往上一级,就到了 Activity 的根 View —— DecorView,结构

如下图所示:

要做到像 iOS 那样可以滑动整个 Activity ,只滑动我们在xml里面创建的 View 显然是不对的,因为我们还有标题栏、ActionBar 什么的,所以我们要滑动的应该是 DecorView 或者倒数第二层的那个 View。

而要滑动 View的话,我们要重写其父窗口的 onInterceptTouchEvent 以及 onTouchEvent(当然使用 setOnTouchListener 不是不可能,但是如果子 View 里面有一个消费了 onTouch 事件,那么也就接收不到了),但是窗口的创建过程不是我们能控制的,DecorView 的创建都不是我们能干预的。

解决办法就是,我们自己创建一个 SwipeLayout,然后人为地插入顶层 View 中,放置在 DecorView 和其下面的 LinearLayout 中间,随着手指的滑动,不断改变 SwipeLayout 的子 View ——曾经是 DecorView 的子 View——的位置,这样我们就可以控制 Activity 的滑动啦。我们在 Activity 的 onPostCreate 方法中调用swipeLayout.replaceLayer 替换我们的 SwipeLayout,代码如下:

public void replaceLayer(Activity activity) {

  mActivity = activity;
  screenWidth = getScreenWidth(activity);
  setClickable(true);
  //获取 Activity 的 根 View
  ViewGroup root = (ViewGroup) activity.getWindow().getDecorView();
  //获取 根 View 下面的第一个 View,并保存到 content
  content = root.getChildAt(0);
  ViewGroup.LayoutParams params = content.getLayoutParams();
  ViewGroup.LayoutParams params2 = new ViewGroup.LayoutParams(-1, -1);
  //把根 View 下面原来的第一个 View 删除
  root.removeView(content);
  //把 content 添加到 SwipeLayout
  this.addView(content, params2);
  //再把 SwipeLayout 添加到根 View 里面
  root.addView(this, params);
  sideWidth = (int) (sideWidthInDP * activity.getResources().getDisplayMetrics().density);
}


然后把这些写成一个 SwipeActivity 要求实现侧滑返回的 Activity 继承 SwipeActivity , SwipeActivity 继承 FragmentActivity 或者 Activity 。比如 MainActivity:

public class SwipeActivity extends FragmentActivity {
  ...
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }
  ...
}

public class MainActivity extends SwipeActivity {
  ...
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }
  ...
}

总结

其实在工作中,开发一个项目基本都会封装一个 BaseActivity,只要 BaseActivity 继承 SwipeActivity ,然后所有继承 BaseActivity 的 Activity 就都可以实现侧滑返回了, 如果有不需要实现这个功能的只需要调用 SwipeActivity 里面的一个方法:
public void setSwipeEnabled(boolean swipeEnabled) 参数传一个 false 就好了。是不是很方便!

其实另外还暴露出来一个方法:
public void setSwipeAnyWhere(boolean swipeAnyWhere) 设置是否屏幕任意位置右滑关闭,因为默认是只能左边缘右滑返回。

最后

附上原github: https://github.com/NashLegend/SwipetoFinishActivity

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

相关文章

  • Android编程实现实时监听EditText文本输入的方法

    Android编程实现实时监听EditText文本输入的方法

    这篇文章主要介绍了Android编程实现实时监听EditText文本输入的方法,结合实例形式分析了EditText控件及事件响应相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • Android编程实现点击链接打开APP功能示例

    Android编程实现点击链接打开APP功能示例

    这篇文章主要介绍了Android编程实现点击链接打开APP功能,结合实例形式较为详细的分析了Android实现点击链接打开APP功能的具体步骤与相关注意事项,需要的朋友可以参考下
    2017-01-01
  • Android Handler机制的工作原理详析

    Android Handler机制的工作原理详析

    这篇文章主要给大家介绍了关于Android Handler机制的工作原理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Android如何利用svg实现可缩放的地图控件

    Android如何利用svg实现可缩放的地图控件

    这篇文章主要给大家介绍了关于Android如何利用svg实现可缩放的地图控件的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • Android无需权限调起系统相机

    Android无需权限调起系统相机

    在进行一些小型APP的开发,或者是对拍照界面没有自定义要求时,我们可以用调起系统相机的方式快速完成拍照需求
    2023-03-03
  • android基础总结篇之一:Activity生命周期

    android基础总结篇之一:Activity生命周期

    本篇文章主要介绍了android基础总结篇之一:Activity生命周期,想要学习的可以了解一下。
    2016-11-11
  • Android Studio实现简单的QQ登录界面的示例代码

    Android Studio实现简单的QQ登录界面的示例代码

    这篇文章主要介绍了Android Studio实现简单的QQ登录界面的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Android 判断某个服务(service)是否运行

    Android 判断某个服务(service)是否运行

    这篇文章主要介绍了 Android 判断某个服务(service)是否运行的相关资料,需要的朋友可以参考下
    2017-06-06
  • Android使用token维持登陆状态的方法

    Android使用token维持登陆状态的方法

    这篇文章主要介绍了Android使用token维持登陆状态的方法,包括token的概念及作用介绍,本文给大家介绍的非常详细,需要的朋友参考下吧
    2017-01-01
  • Kotlin使用静态变量与静态方法详解

    Kotlin使用静态变量与静态方法详解

    kotlin定义静态变量、方法可以采用伴生对象companion object的方式。 下面这篇文章主要给大家介绍了关于Kotlin使用静态变量与静态方法的相关资料,需要的朋友可以参考下
    2018-12-12

最新评论