forked from getActivity/AndroidProject
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUIActivity.java
More file actions
180 lines (155 loc) · 5.77 KB
/
UIActivity.java
File metadata and controls
180 lines (155 loc) · 5.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
package com.hjq.demo.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 com.hjq.demo.R;
import cn.bingoogolapple.swipebacklayout.BGASwipeBackHelper;
/**
* author : Android 轮子哥
* github : https://github.com/getActivity/AndroidProject
* time : 2018/10/18
* desc : 支持沉浸式和侧滑的Activity基类(默认开启沉浸式状态栏和侧滑功能)
*/
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 (getTitleBarId() > 0) {
ImmersionBar.setTitleBar(this, findViewById(getTitleBarId()));
}
}
}
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() {
return true;
}
/**
* 正在滑动返回
*
* @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;
}
/**
* 初始化沉浸式状态栏
*/
private 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);
}
}
}