效果演示
初始状态
滑动中状态
结束状态
这是目前实现在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) { } }
使得能适配4.0 - 5.0+所有的设备
转自:https://segmentfault.com/a/1190000002977515