您的位置:首页 > 移动开发 > Android开发

Android实现SwipeBack(右滑退出)效果

2016-02-24 00:01 423 查看


效果演示


初始状态




滑动中状态




结束状态



这是目前实现在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: