package eVVM.apk.common; import android.os.Build; import android.os.Bundle; import android.view.ViewTreeObserver; import android.view.WindowManager; import com.gyf.barlibrary.ImmersionBar; import com.hjq.base.BaseActivity; import cn.bingoogolapple.swipebacklayout.BGASwipeBackHelper; import eVVM.apk.R; public abstract class UIActivity extends BaseActivity implements BGASwipeBackHelper.Delegate, ViewTreeObserver.OnGlobalLayoutListener { private ImmersionBar mImmersionBar;//状态栏沉浸 private BGASwipeBackHelper mSwipeBackHelper;//侧滑返回 @Override protected void onCreate(Bundle savedInstanceState) { // 在 super.onCreate(savedInstanceState) 之前调用该方法 initSwipeBack(); super.onCreate(savedInstanceState); } @Override protected void initLayout() { super.initLayout(); initImmersion(); } /** * 初始化沉浸式 */ protected void initImmersion() { //初始化沉浸式状态栏 if (isStatusBarEnabled()) { statusBarConfig().init(); //设置标题栏 if (getTitleId() > 0) { ImmersionBar.setTitleBar(this, findViewById(getTitleId())); } } } public BGASwipeBackHelper getSwipeBackHelper() { return mSwipeBackHelper; } /** * 初始化滑动返回。在 super.onCreate(savedInstanceState) 之前调用该方法 */ private void initSwipeBack() { mSwipeBackHelper = new BGASwipeBackHelper(this, this); // 「必须在 Application 的 onCreate 方法中执行 BGASwipeBackHelper.init 来初始化滑动返回」 // 下面几项可以不配置,这里只是为了讲述接口用法。 // 设置滑动返回是否可用。默认值为 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); // 设置触发释放后自动滑动返回的阈值,默认值为 0.3f mSwipeBackHelper.setSwipeBackThreshold(0.3f); // 设置底部导航条是否悬浮在内容上,默认值为 false mSwipeBackHelper.setIsNavigationBarOverlap(false); } /** * {@link BGASwipeBackHelper.Delegate} */ /** * 是否支持滑动返回。这里在父类中默认返回 true 来支持滑动返回,如果某个界面不想支持滑动返回则重写该方法返回 false 即可 */ @Override public boolean isSupportSwipeBack() { // android 9.0系统滑动返回上一级时闪屏:https://github.com/bingoogolapple/BGASwipeBackLayout-Android/issues/154 return Build.VERSION.SDK_INT < Build.VERSION_CODES.P; } /** * 正在滑动返回 * * @param slideOffset 从 0 到 1 */ @Override public void onSwipeBackLayoutSlide(float slideOffset) {} /** * 没达到滑动返回的阈值,取消滑动返回动作,回到默认状态 */ @Override public void onSwipeBackLayoutCancel() {} /** * 滑动返回执行完毕,销毁当前 Activity */ @Override public void onSwipeBackLayoutExecuted() { mSwipeBackHelper.swipeBackward(); } @Override public void onBackPressed() { // 正在滑动返回的时候取消返回按钮事件 if (mSwipeBackHelper.isSliding()) { return; } mSwipeBackHelper.backward(); super.onBackPressed(); } /** * 是否使用沉浸式状态栏 */ public boolean isStatusBarEnabled() { return true; } /** * 获取状态栏沉浸的配置对象 */ public ImmersionBar getStatusBarConfig() { return mImmersionBar; } /** * 初始化沉浸式状态栏 */ protected ImmersionBar statusBarConfig() { //在BaseActivity里初始化 mImmersionBar = ImmersionBar.with(this) .statusBarDarkFont(statusBarDarkFont()) //默认状态栏字体颜色为黑色 .keyboardEnable(false, WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); //解决软键盘与底部输入框冲突问题,默认为false,还有一个重载方法,可以指定软键盘mode //必须设置View树布局变化监听,否则软键盘无法顶上去,还有模式必须是SOFT_INPUT_ADJUST_PAN getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(this); return mImmersionBar; } /** * {@link ViewTreeObserver.OnGlobalLayoutListener} */ @Override public void onGlobalLayout() {}//不用写任何方法 /** * 获取状态栏字体颜色 */ public boolean statusBarDarkFont() { //返回false表示白色字体 return true; } @Override protected void onDestroy() { super.onDestroy(); if (mImmersionBar != null) mImmersionBar.destroy(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this); } } }