V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bingoogolapple
V2EX  ›  Android

BGA 全家桶之 Activity 滑动返回,支持微信滑动返回样式

  •  
  •   bingoogolapple · 2017-01-12 22:30:31 +08:00 · 8341 次点击
    这是一个创建于 2883 天前的主题,其中的信息可能已经有所发展或是发生改变。

    BGASwipeBackLayout-Android

    强烈建议与 StatusBarUtil 结合着一起使用

    常见问题与反馈

    1.滑动返回时看见了 Launcher

    保证栈底 Activity 的主题是不透明的。例如 demo 中的首个 Activity 是 SplashActivity ,进入主界面后 SplashActivity 就销毁了,此时 MainActivity 就是栈底 Activity ,需保证 MainActivity 的主题不透明

    2.滑动返回不生效

    必须在 Application 的 onCreate 方法中执行 BGASwipeBackManager.getInstance().init(this) 来初始化滑动返回

    3.如果发现某些手机上底部出现空白区域,麻烦打印以下信息新建 Issue 反馈

    android.Build.VERSION.SDK_INT
    
    android.Build.MODEL
    

    功能介绍

    • 通过修改 support-v4 包中 SlidingPaneLayout 的源码来实现滑动返回布局
    • 动态设置滑动返回是否可用
    • 动态设置是否仅仅跟踪左侧边缘的滑动返回
    • 动态设置是否是微信滑动返回样式
    • 动态设置是否显示滑动返回的阴影效果

    效果图与示例 apk

    | BGASwipeBackLayoutDemo | BGASwipeBackLayoutDemo-WeChat |

    | bgaswipebacklayout-swipe-delete | bgaswipebacklayout-recycler-index |

    点击下载 BGASwipeBackLayoutDemo.apk 或扫描下面的二维码安装

    BGASwipeBackLayoutDemo apk 文件二维码

    1.添加 Gradle 依赖

    Maven Central bga-swipebacklayout 后面的「 latestVersion 」指的是左边这个 maven-central 徽章后面的「数字」,请自行替换。

    dependencies {
        compile 'cn.bingoogolapple:bga-swipebacklayout:latestVersion@aar'
    
        // 换成己工程里依赖的 support-v4 的版本
        compile 'com.android.support:support-v4:25.1.0'
    }
    

    2.必须在 Application 的 onCreate 方法中执行 BGASwipeBackManager.getInstance().init(this) 来初始化滑动返回

    public class App extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            // 必须在 Application 的 onCreate 方法中执行 BGASwipeBackManager.getInstance().init(this) 来初始化滑动返回
            BGASwipeBackManager.getInstance().init(this);
        }
    }
    

    3.为需要支持滑动返回的 Activity 设置透明主题 AppTheme.Transparent

    <!-- 这里面的内容改成你自己项目里的 -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!--colorPrimaryDark 对应状态栏的颜色-->
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <!--colorPrimary 对应 ActionBar 的颜色-->
        <item name="colorPrimary">@color/colorPrimary</item>
        <!-- 底部导航栏的颜色 -->
        <item name="android:navigationBarColor" tools:targetApi="lollipop">@color/navigationBarColor</item>
        <item name="android:windowBackground">@color/windowBackground</item>
        <!--colorAccent 对应 EditText 编辑时、 RadioButton 选中、 CheckBox 等选中时的颜色-->
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    
    <!-- 用于开启滑动返回功能的 Activity -->
    <style name="AppTheme.Transparent">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>
    

    4.将下面的代码拷贝到你自己的 BaseActivity 中,建议参考 demo 里的这个 BaseActivity 来设置界面跳转动画

    public abstract class BaseActivity extends AppCompatActivity implements BGASwipeBackHelper.Delegate, View.OnClickListener {
        protected BGASwipeBackHelper mSwipeBackHelper;
        protected Toolbar mToolbar;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            // 「必须在 Application 的 onCreate 方法中执行 BGASwipeBackManager.getInstance().init(this) 来初始化滑动返回」
            // 在 super.onCreate(savedInstanceState) 之前调用该方法
            initSwipeBackFinish();
            super.onCreate(savedInstanceState);
        }
    
        /**
         * 初始化滑动返回。在 super.onCreate(savedInstanceState) 之前调用该方法
         */
        private void initSwipeBackFinish() {
            mSwipeBackHelper = new BGASwipeBackHelper(this, this);
    
            // 「必须在 Application 的 onCreate 方法中执行 BGASwipeBackManager.getInstance().init(this) 来初始化滑动返回」
            // 下面几项可以不配置,这里只是为了讲述接口用法。
    
            // 设置滑动返回是否可用。默认值为 true
            mSwipeBackHelper.setSwipeBackEnable(true);
            // 设置是否仅仅跟踪左侧边缘的滑动返回。默认值为 true
            mSwipeBackHelper.setIsOnlyTrackingLeftEdge(true);
            // 设置是否是微信滑动返回样式。默认值为 true
            mSwipeBackHelper.setIsWeChatStyle(true);
            // 设置阴影资源 id 。默认值为 R.drawable.bga_sbl_shadow
            mSwipeBackHelper.setShadowResId(R.drawable.bga_sbl_shadow);
            // 设置是否显示滑动返回的阴影效果。默认值为 true
            mSwipeBackHelper.setIsNeedShowShadow(true);
            // 设置阴影区域的透明度是否根据滑动的距离渐变。默认值为 true
            mSwipeBackHelper.setIsShadowAlphaGradient(true);
        }
    
        /**
         * 是否支持滑动返回。这里在父类中默认返回 true 来支持滑动返回,如果某个界面不想支持滑动返回则重写该方法返回 false 即可
         *
         * @return
         */
        @Override
        public boolean isSupportSwipeBack() {
            return true;
        }
    
        /**
         * 正在滑动返回
         *
         * @param slideOffset 从 0 到 1
         */
        @Override
        public void onSwipeBackLayoutSlide(float slideOffset) {
        }
    
        /**
         * 没达到滑动返回的阈值,取消滑动返回动作,回到默认状态
         */
        @Override
        public void onSwipeBackLayoutCancel() {
        }
    
        /**
         * 滑动返回执行完毕,销毁当前 Activity
         */
        @Override
        public void onSwipeBackLayoutExecuted() {
            mSwipeBackHelper.swipeBackward();
        }
    }
    

    5.强烈强烈强烈建议把 BGASwipeBackHelper 里的每个方法的注释看一遍,只看注释就好

    demo 中用到的第三方库

    • StatusBarUtil A util for setting status bar style on Android App
    • BGAAdapter-Android 在 AdapterView 和 RecyclerView 中通用的 Adapter 和 ViewHolder 。 RecyclerView 支持 DataBinding 、多种 Item 类型、添加 Header 和 Footer 。 RecyclerView 竖直方向通用分割线 BGADivider
    • BGAProgressBar-Android 带百分比数字的水平、圆形进度条
    • BGARefreshLayout-Android 多种下拉刷新效果、上拉加载更多、可配置自定义头部广告位
    • BGASwipeItemLayout-Android 类似 iOS 带弹簧效果的左右滑动控件,可作为 AbsListView 和 RecyclerView 的 item
    • 谷爹的 support 包

    License

    Copyright (C) 2012 The Android Open Source Project
    Copyright 2016 bingoogolapple
    
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    
       http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    
    2 条回复    2017-01-13 09:22:10 +08:00
    faywong8888
        1
    faywong8888  
       2017-01-13 08:24:57 +08:00 via iPhone
    +1 ,看起来应该不错,有空试试
    bingoogolapple
        2
    bingoogolapple  
    OP
       2017-01-13 09:22:10 +08:00
    @faywong8888 通过修改 support-v4 包中 SlidingPaneLayout 的源码来实现滑动返回布局,新增的代码全用

    // ======================== 新加的 START ========================



    // ======================== 新加的 END ========================

    包裹起来的,建议研究下源码
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5754 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:22 · PVG 11:22 · LAX 19:22 · JFK 22:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.