Skip to content

Commit 899e73a

Browse files
committed
Merge branch 'master' into support
# Conflicts: # anylayer/build.gradle
2 parents f4a9cea + 7089d77 commit 899e73a

File tree

4 files changed

+112
-106
lines changed

4 files changed

+112
-106
lines changed

README.md

Lines changed: 27 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@ Android稳定高效的浮层创建管理框架。
1414

1515

1616

17+
# 优势
18+
19+
如果你的App用的是单Activity架构,那么这个就是系统Dialog/PopupWindow/Toast的完美替代。而且可以实现悬浮按钮和引导层等一些列功能。
20+
21+
不是单Activity也不影响,上面这些功能一样可以实现,只是
22+
23+
- 相对于Dialog更轻量,相对于PopupWindow
24+
25+
26+
1727
# 简介
1828

1929
- 同时兼容support和androidx
@@ -93,14 +103,16 @@ Android稳定高效的浮层创建管理框架。
93103

94104
![](https://img.shields.io/badge/Downloads%20Week-1.4k-green) ![](https://img.shields.io/badge/Downloads%20Month-7.3K-blue)
95105

96-
- ### 添加jitpack库
106+
- ### 添加仓库
97107

98108
```groovy
99109
// build.gradle(Project:)
100110
allprojects {
101111
repositories {
102-
maven { url 'https://www.jitpack.io' }
112+
maven { url "https://www.jitpack.io" }
113+
103114
// 支持4.1.0及以后版本
115+
// 使用4.1.5及以后版本必须添加,因为高斯模糊实现用到的VisualEffect库暂时只发布在了的gitee仓库
104116
// maven { url "https://gitee.com/goweii/maven-repository/raw/master/releases/" }
105117
}
106118
}
@@ -113,82 +125,32 @@ allprojects {
113125
// build.gradle(Module:)
114126
dependencies {
115127
// 完整引入,二选一
116-
implementation 'com.github.goweii:AnyLayer:4.1.4-androidx'
117-
implementation 'com.github.goweii:AnyLayer:4.1.4-support'
128+
implementation "com.github.goweii:AnyLayer:4.1.4-androidx"
129+
// implementation "com.github.goweii:AnyLayer:4.1.4-support"
118130
131+
// 按需引入
119132
// 基础库
120-
// implementation 'com.github.goweii.AnyLayer:anylayer:4.1.4-androidx'
121-
// 自动初始化(依赖基础库和Android Jetpack App Startup)
122-
// implementation 'com.github.goweii.AnyLayer:anylayer-startup:4.1.4-androidx'
133+
// implementation "com.github.goweii.AnyLayer:anylayer:4.1.4-androidx"
134+
// 自动初始化(依赖基础库和Jetpack Startup)
135+
// implementation "com.github.goweii.AnyLayer:anylayer-startup:4.1.4-androidx"
123136
// 扩展库(依赖基础库)
124-
// implementation 'com.github.goweii.AnyLayer:anylayer-ext:4.1.4-androidx'
137+
// implementation "com.github.goweii.AnyLayer:anylayer-ext:4.1.4-androidx"
125138
// Kotlin扩展库(依赖基础库和扩展库)
126-
// implementation 'com.github.goweii.AnyLayer:anylayer-ktx:4.1.4-androidx'
139+
// implementation "com.github.goweii.AnyLayer:anylayer-ktx:4.1.4-androidx"
127140
}
128141
```
129142

143+
- ### 一些问题/建议
130144

145+
- 建议按需引入
131146

132-
## 更新说明
133-
134-
[点击查看详细更新说明](https://github.com/goweii/AnyLayer/releases)
135-
136-
### 4.1.3
137-
138-
- 优化输入法适配
139-
- 修复一些BUG
140-
141-
### 4.1.1
142-
143-
- 修复物理返回键事件拦截问题
144-
- 修复带输入框弹窗点击外部关闭需要2次才能触发的问题
145-
146-
### 4.1.0
147-
148-
- 适配分屏小窗和横竖屏切换
149-
- 新增设置通知最大宽高
150-
- 新增3组对其方式
151-
- 新增吐司自定义布局
152-
- 吐司和通知默认布局适配暗色模式
153-
- 修复一些代码错误
147+
- anylayer-startup依赖于Jetpack Startup,仅支持androidx,support需要自己在application初始化
154148

155-
### 4.0.0
156149

157-
- 重构包结构
158-
- 新增通知/悬浮按钮/引导浮层
159-
- 支持自定义浮层层级
160150

161-
### 3.6.0
162-
163-
- 新增ext库,添加常用动画创建器
164-
- 新增ktx库,方便kotlin调用
165-
166-
### 3.5.0
167-
168-
- 添加注解,避免kotlin调用变为可选型
169-
170-
### 3.3.0
171-
172-
- 拆分为support和androidx两个分支
173-
174-
### 3.1.0
175-
176-
- 移除对support-v7的依赖,可同时兼容support和androidx
177-
178-
### 3.0.0
179-
180-
- 大型重构,修改层级和继承结构,API改变很大
181-
- 删除common库
182-
183-
### 2.5.0
184-
185-
- 新增popupWindow效果时可跟随targetView移动
186-
- 可以从ApplicationContext中弹出
187-
- 监听器支持添加多个
188-
189-
### 2.4.0
151+
## 更新说明
190152

191-
- 新增通用库
153+
[点击查看](https://github.com/goweii/AnyLayer/releases)
192154

193155

194156

anylayer/src/main/java/per/goweii/anylayer/DecorLayer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,11 @@ public void run() {
211211
}
212212

213213
@Override
214-
public void dismiss() {
214+
public void dismiss(boolean withAnim) {
215215
if (mShowRunnable != null) {
216216
getViewHolder().getDecor().removeCallbacks(mShowRunnable);
217217
} else {
218-
super.dismiss();
218+
super.dismiss(withAnim);
219219
}
220220
}
221221

anylayer/src/main/java/per/goweii/anylayer/Layer.java

Lines changed: 67 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,27 @@ public boolean onKey(int keyCode, KeyEvent event) {
4242
}
4343
};
4444

45+
private final Runnable mInAnimEndCallback = new Runnable() {
46+
@Override
47+
public void run() {
48+
Layer.this.handleInAnimEnd();
49+
}
50+
};
51+
52+
private final Runnable mOutAnimEndCallback = new Runnable() {
53+
@Override
54+
public void run() {
55+
Layer.this.handleOutAnimEnd();
56+
}
57+
};
58+
4559
private final ViewManager mViewManager;
4660
private final ViewHolder mViewHolder;
4761
private final ListenerHolder mListenerHolder;
4862
private final Config mConfig;
4963

64+
private ViewTreeObserver.OnPreDrawListener mShowOnPreDrawListener = null;
65+
5066
private boolean mShowWithAnim = false;
5167
private boolean mDismissWithAnim = false;
5268

@@ -192,38 +208,32 @@ protected void onGlobalPreDraw() {
192208
private void handleShow() {
193209
if (isShown()) {
194210
if (isOutAnimRunning()) {
195-
startAnimatorIn(new Runnable() {
196-
@Override
197-
public void run() {
198-
onShow();
199-
}
200-
});
211+
startAnimatorIn();
201212
}
202213
return;
203214
}
204215
onCreate();
205216
mViewManager.attach();
206217
onAttach();
207218
getViewHolder().getChild().setVisibility(View.VISIBLE);
208-
getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
209-
@Override
210-
public boolean onPreDraw() {
211-
if (getViewTreeObserver().isAlive()) {
212-
getViewTreeObserver().removeOnPreDrawListener(this);
213-
}
214-
onAppear();
215-
startAnimatorIn(new Runnable() {
216-
@Override
217-
public void run() {
218-
onShow();
219+
if (mShowOnPreDrawListener == null) {
220+
mShowOnPreDrawListener = new ViewTreeObserver.OnPreDrawListener() {
221+
@Override
222+
public boolean onPreDraw() {
223+
mShowOnPreDrawListener = null;
224+
if (getViewTreeObserver().isAlive()) {
225+
getViewTreeObserver().removeOnPreDrawListener(this);
219226
}
220-
});
221-
return true;
222-
}
223-
});
227+
onAppear();
228+
startAnimatorIn();
229+
return true;
230+
}
231+
};
232+
}
233+
getViewTreeObserver().addOnPreDrawListener(mShowOnPreDrawListener);
224234
}
225235

226-
private void startAnimatorIn(@NonNull Runnable onEnd) {
236+
private void startAnimatorIn() {
227237
cancelAnimator();
228238
if (mShowWithAnim) {
229239
mAnimatorIn = onCreateInAnimator(mViewHolder.getChild());
@@ -237,34 +247,41 @@ public void onAnimationEnd(Animator animation) {
237247

238248
@Override
239249
public void onAnimationEndWithoutCancel(Animator animation) {
240-
onEnd.run();
250+
super.onAnimationEndWithoutCancel(animation);
251+
mInAnimEndCallback.run();
241252
}
242253
});
243254
mAnimatorIn.start();
244255
} else {
245-
onEnd.run();
256+
mInAnimEndCallback.run();
246257
}
247258
} else {
248-
onEnd.run();
259+
mInAnimEndCallback.run();
249260
}
250261
}
251262

263+
private void handleInAnimEnd() {
264+
onShow();
265+
}
266+
252267
private void handleDismiss() {
253268
if (!isShown()) return;
254269
if (isOutAnimRunning()) return;
255-
onDismiss();
256-
startAnimatorOut(new Runnable() {
257-
@Override
258-
public void run() {
259-
onDisappear();
260-
mViewManager.detach();
261-
onDetach();
262-
onDestroy();
270+
if (mShowOnPreDrawListener != null) {
271+
mShowOnPreDrawListener = null;
272+
if (getViewTreeObserver().isAlive()) {
273+
getViewTreeObserver().removeOnPreDrawListener(mShowOnPreDrawListener);
263274
}
264-
});
275+
mViewManager.detach();
276+
onDetach();
277+
onDestroy();
278+
return;
279+
}
280+
onDismiss();
281+
startAnimatorOut();
265282
}
266283

267-
private void startAnimatorOut(@NonNull final Runnable onEnd) {
284+
private void startAnimatorOut() {
268285
cancelAnimator();
269286
if (mDismissWithAnim) {
270287
mAnimatorOut = onCreateOutAnimator(mViewHolder.getChild());
@@ -278,33 +295,45 @@ public void onAnimationEnd(Animator animation) {
278295

279296
@Override
280297
public void onAnimationEndWithoutCancel(Animator animation) {
298+
super.onAnimationEndWithoutCancel(animation);
281299
// 动画执行结束后不能直接removeView,要在下一个dispatchDraw周期移除
282300
// 否则会崩溃,因为viewGroup的childCount没有来得及-1,获取到的view为空
283301
getViewHolder().getChild().setVisibility(View.INVISIBLE);
284-
getViewHolder().getParent().post(onEnd);
302+
getViewHolder().getParent().post(mOutAnimEndCallback);
285303
}
286304
});
287305
mAnimatorOut.start();
288306
} else {
289307
getViewHolder().getChild().setVisibility(View.INVISIBLE);
290-
onEnd.run();
308+
mOutAnimEndCallback.run();
291309
}
292310
} else {
293311
getViewHolder().getChild().setVisibility(View.INVISIBLE);
294-
onEnd.run();
312+
mOutAnimEndCallback.run();
295313
}
296314
}
297315

316+
private void handleOutAnimEnd() {
317+
onDisappear();
318+
mViewManager.detach();
319+
onDetach();
320+
onDestroy();
321+
}
322+
298323
private ViewTreeObserver getViewTreeObserver() {
299324
return getViewHolder().getParent().getViewTreeObserver();
300325
}
301326

302327
private void cancelAnimator() {
328+
getViewHolder().getParent().removeCallbacks(mInAnimEndCallback);
329+
getViewHolder().getParent().removeCallbacks(mOutAnimEndCallback);
303330
if (mAnimatorIn != null) {
331+
mAnimatorIn.removeAllListeners();
304332
mAnimatorIn.cancel();
305333
mAnimatorIn = null;
306334
}
307335
if (mAnimatorOut != null) {
336+
mAnimatorOut.removeAllListeners();
308337
mAnimatorOut.cancel();
309338
mAnimatorOut = null;
310339
}

app/src/main/java/per/goweii/android/anylayer/NormalActivity.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,22 @@ public void onClick(@NonNull Layer layer, @NonNull View v) {
126126
.cancelableOnClickKeyBack(true)
127127
.onClickToDismiss(R.id.fl_dialog_no);
128128
dialog.show();
129-
dialog.dismiss();
129+
new Thread(new Runnable() {
130+
@Override
131+
public void run() {
132+
try {
133+
Thread.sleep(30);
134+
} catch (InterruptedException e) {
135+
e.printStackTrace();
136+
}
137+
runOnUiThread(new Runnable() {
138+
@Override
139+
public void run() {
140+
dialog.dismiss();
141+
}
142+
});
143+
}
144+
}).start();
130145
}
131146

132147
private Random mRandom = new Random();

0 commit comments

Comments
 (0)