这是目前实现在SegmentFault for Android v2.6中的效果。
一切一切的之前,感谢 ikew0ng/SwipeBackLayout
我使用这个库,并经过一些修改,支持了Android 4.0以上所有的版本。
我们来分析下SwipeBackLayout
的源码
我之前做过实验,碰到的最大问题是上层的Activity底下并不是透明的,因此看不见下层Activity的视图。
在SwipeBackLayout
中采用的方案是使用一个叫convertToTranslucent
的未公开的api,再配合theme
中
把windowIsTranslucent
设置为true
,即可实现上层的Window
背景为透明。
这里要注意的地方是调用convertToTranslucent
可以使用反射的方法进行调用,但是在Lollipop
中,它的参数变成了两个,而在5.0以下是一个参数,所以需要在源码中对Util.convertActivityToTranslucent
这个方法进行一些修改。
public static void convertActivityToTranslucent(Activity activity) { try { Class[] t = Activity.class.getDeclaredClasses(); Class translucentConversionListenerClazz = null; Class[] method = t; int len$ = t.length; for(int i$ = 0; i$ < len$; ++i$) { Class clazz = method[i$]; if(clazz.getSimpleName().contains("TranslucentConversionListener")) { translucentConversionListenerClazz = clazz; break; } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Method var8 = Activity.class.getDeclaredMethod("convertToTranslucent", translucentConversionListenerClazz, ActivityOptions.class); var8.setAccessible(true); var8.invoke(activity, new Object[]{null, null}); } else { Method var8 = Activity.class.getDeclaredMethod("convertToTranslucent", translucentConversionListenerClazz); var8.setAccessible(true); var8.invoke(activity, new Object[]{null}); } } catch (Throwable e) { } }
转自:https://segmentfault.com/a/1190000002977515
扩展:
An Android library that can finish a Fragment&Activity with swipe-back gesture.
滑动Fragment&Activity边缘即可类似IOS一样,拖动返回。
原理分析:传送门, 如果你重度使用Fragment,不妨看看这个库Fragmentation
1、Activity内Fragment数大于1时,滑动返回的是Fragment,否则滑动返回的是Activity。
2、支持左、右、左&右滑动(未来可能会增加更多滑动区域)
3、支持Scroll中的滑动监听
4、帮你处理了Fragment重叠的情况