如何实现类似微信右滑返回的效果

Fragment的实现

  • 对于Fragment的控制相对简单
  • 不涉及window的控制,只是View级别的操作
  • 实现View跟随手势滑动移动的效果
  • 实现手势结束后判断取消或返回执行归位动画

Activity的实现

  • 处理好window的控制

    • 修改activity的style属性:

      1
      2
      3
      4
      <style name="AppTranslucentTheme" parent="AppTheme">
      <item name="android:windowBackground">@android:color/transparent</item>
      <item name="android:windowIsTranslucent">true</item>
      </style>
  • Activity联动(多个activity栈)

    Activity A和Activity C在Task#0

    Activity B在Task#1

    当Activity A跳转Activity B时没有问题(有动画效果)

    再当Activity B跳转Activity C时,会先出现Activity A,然后动画效果到Activity C

    处理方法:再Activity B跳转Activity C的时候将B页面整体截屏放到Activity C的下面。

    获取Activity的栈:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Activity.java
    public int getTaskId() {
    try {
    return ActivityManager.getService()
    .getTaskForActivity(mToken, false);
    } catch (RemoteException e) {
    return -1;
    }
    }

Activity透明对生命周期的影响

1
2
3
4
5
graph TB
Created -- onStart --> Started
Started -- onResume --> Resumed
Resumed -- onPause -->Started
Started -- onStop --> Created

A、B、C、D四个Activity依次跳转,此时Activity栈中:A->B->C->D。(默认都不透明)

  • 如果D为不透明Activity,那么:D为Resumed状态(可操作),ABC为Created状态(不可见)。
  • 如果D为透明Activity,那么:D为Resumed状态(可操作),C为Started状态(可见,不可操作),AB为Created状态(不可见)
  • 如果C、D为透明Activity,那么::D为Resumed状态(可操作),B、C为Started状态(可见,不可操作),A为Created状态(不可见)

实现滑动返回接口