505d99498385273bdd6b966c99b7481c2e730562.svn-base 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package eVVM.apk.common;
  2. import android.os.Build;
  3. import android.os.Bundle;
  4. import android.view.ViewTreeObserver;
  5. import android.view.WindowManager;
  6. import com.gyf.barlibrary.ImmersionBar;
  7. import com.hjq.base.BaseActivity;
  8. import cn.bingoogolapple.swipebacklayout.BGASwipeBackHelper;
  9. import eVVM.apk.R;
  10. public abstract class UIActivity extends BaseActivity
  11. implements BGASwipeBackHelper.Delegate,
  12. ViewTreeObserver.OnGlobalLayoutListener {
  13. private ImmersionBar mImmersionBar;//状态栏沉浸
  14. private BGASwipeBackHelper mSwipeBackHelper;//侧滑返回
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. // 在 super.onCreate(savedInstanceState) 之前调用该方法
  18. initSwipeBack();
  19. super.onCreate(savedInstanceState);
  20. }
  21. @Override
  22. protected void initLayout() {
  23. super.initLayout();
  24. initImmersion();
  25. }
  26. /**
  27. * 初始化沉浸式
  28. */
  29. protected void initImmersion() {
  30. //初始化沉浸式状态栏
  31. if (isStatusBarEnabled()) {
  32. statusBarConfig().init();
  33. //设置标题栏
  34. if (getTitleId() > 0) {
  35. ImmersionBar.setTitleBar(this, findViewById(getTitleId()));
  36. }
  37. }
  38. }
  39. public BGASwipeBackHelper getSwipeBackHelper() {
  40. return mSwipeBackHelper;
  41. }
  42. /**
  43. * 初始化滑动返回。在 super.onCreate(savedInstanceState) 之前调用该方法
  44. */
  45. private void initSwipeBack() {
  46. mSwipeBackHelper = new BGASwipeBackHelper(this, this);
  47. // 「必须在 Application 的 onCreate 方法中执行 BGASwipeBackHelper.init 来初始化滑动返回」
  48. // 下面几项可以不配置,这里只是为了讲述接口用法。
  49. // 设置滑动返回是否可用。默认值为 true
  50. mSwipeBackHelper.setSwipeBackEnable(true);
  51. // 设置是否仅仅跟踪左侧边缘的滑动返回。默认值为 true
  52. mSwipeBackHelper.setIsOnlyTrackingLeftEdge(true);
  53. // 设置是否是微信滑动返回样式。默认值为 true
  54. mSwipeBackHelper.setIsWeChatStyle(true);
  55. // 设置阴影资源 id。默认值为 R.drawable.bga_sbl_shadow
  56. mSwipeBackHelper.setShadowResId(R.drawable.bga_sbl_shadow);
  57. // 设置是否显示滑动返回的阴影效果。默认值为 true
  58. mSwipeBackHelper.setIsNeedShowShadow(true);
  59. // 设置阴影区域的透明度是否根据滑动的距离渐变。默认值为 true
  60. mSwipeBackHelper.setIsShadowAlphaGradient(true);
  61. // 设置触发释放后自动滑动返回的阈值,默认值为 0.3f
  62. mSwipeBackHelper.setSwipeBackThreshold(0.3f);
  63. // 设置底部导航条是否悬浮在内容上,默认值为 false
  64. mSwipeBackHelper.setIsNavigationBarOverlap(false);
  65. }
  66. /**
  67. * {@link BGASwipeBackHelper.Delegate}
  68. */
  69. /**
  70. * 是否支持滑动返回。这里在父类中默认返回 true 来支持滑动返回,如果某个界面不想支持滑动返回则重写该方法返回 false 即可
  71. */
  72. @Override
  73. public boolean isSupportSwipeBack() {
  74. // android 9.0系统滑动返回上一级时闪屏:https://github.com/bingoogolapple/BGASwipeBackLayout-Android/issues/154
  75. return Build.VERSION.SDK_INT < Build.VERSION_CODES.P;
  76. }
  77. /**
  78. * 正在滑动返回
  79. *
  80. * @param slideOffset 从 0 到 1
  81. */
  82. @Override
  83. public void onSwipeBackLayoutSlide(float slideOffset) {
  84. }
  85. /**
  86. * 没达到滑动返回的阈值,取消滑动返回动作,回到默认状态
  87. */
  88. @Override
  89. public void onSwipeBackLayoutCancel() {
  90. }
  91. /**
  92. * 滑动返回执行完毕,销毁当前 Activity
  93. */
  94. @Override
  95. public void onSwipeBackLayoutExecuted() {
  96. mSwipeBackHelper.swipeBackward();
  97. }
  98. @Override
  99. public void onBackPressed() {
  100. // 正在滑动返回的时候取消返回按钮事件
  101. if (mSwipeBackHelper.isSliding()) {
  102. return;
  103. }
  104. mSwipeBackHelper.backward();
  105. super.onBackPressed();
  106. }
  107. /**
  108. * 是否使用沉浸式状态栏
  109. */
  110. public boolean isStatusBarEnabled() {
  111. return true;
  112. }
  113. /**
  114. * 获取状态栏沉浸的配置对象
  115. */
  116. public ImmersionBar getStatusBarConfig() {
  117. return mImmersionBar;
  118. }
  119. /**
  120. * 初始化沉浸式状态栏
  121. */
  122. protected ImmersionBar statusBarConfig() {
  123. //在BaseActivity里初始化
  124. mImmersionBar = ImmersionBar.with(this)
  125. .statusBarDarkFont(statusBarDarkFont()) //默认状态栏字体颜色为黑色
  126. .keyboardEnable(false, WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN
  127. | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); //解决软键盘与底部输入框冲突问题,默认为false,还有一个重载方法,可以指定软键盘mode
  128. //必须设置View树布局变化监听,否则软键盘无法顶上去,还有模式必须是SOFT_INPUT_ADJUST_PAN
  129. getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(this);
  130. return mImmersionBar;
  131. }
  132. /**
  133. * {@link ViewTreeObserver.OnGlobalLayoutListener}
  134. */
  135. @Override
  136. public void onGlobalLayout() {
  137. }//不用写任何方法
  138. /**
  139. * 获取状态栏字体颜色
  140. */
  141. public boolean statusBarDarkFont() {
  142. //返回false表示白色字体
  143. return true;
  144. }
  145. @Override
  146. protected void onDestroy() {
  147. super.onDestroy();
  148. if (mImmersionBar != null) mImmersionBar.destroy();
  149. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
  150. getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this);
  151. }
  152. }
  153. }