Skip to content

Commit 19e2ebb

Browse files
committed
修复屏幕旋转后坐标计算的 Bug
新增拖拽回调和动画回弹回调类 新增是否能拖拽到刘海区域的 API 新增判断当前是否处于移动状态的 API
1 parent 232ad93 commit 19e2ebb

16 files changed

+811
-371
lines changed

README.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
* 博客地址:[悬浮窗需求终结者](https://www.jianshu.com/p/247d705b87b6)
66

7-
* 可以扫码下载 Demo 进行演示或者测试,如果扫码下载不了的,[点击此处可直接下载](https://github.com/getActivity/EasyWindow/releases/download/10.3/EasyWindow.apk)
7+
* 可以扫码下载 Demo 进行演示或者测试,如果扫码下载不了的,[点击此处可直接下载](https://github.com/getActivity/EasyWindow/releases/download/10.5/EasyWindow.apk)
88

99
![](picture/demo_code.png)
1010

@@ -49,7 +49,7 @@ android {
4949
5050
dependencies {
5151
// 悬浮窗框架:https://github.com/getActivity/EasyWindow
52-
implementation 'com.github.getActivity:EasyWindow:10.3'
52+
implementation 'com.github.getActivity:EasyWindow:10.5'
5353
}
5454
```
5555

@@ -77,11 +77,11 @@ EasyWindow.with(this)
7777
.setOnClickListener(android.R.id.message, new EasyWindow.OnClickListener<TextView>() {
7878

7979
@Override
80-
public void onClick(EasyWindow toast, TextView view) {
80+
public void onClick(EasyWindow<?> easyWindow, TextView view) {
8181
// 点击这个 View 后消失
82-
toast.cancel();
82+
easyWindow.cancel();
8383
// 跳转到某个Activity
84-
// toast.startActivity(intent);
84+
// easyWindow.startActivity(intent);
8585
}
8686
})
8787
.show();
@@ -104,11 +104,11 @@ EasyWindow.with(activity).apply {
104104
//setBackgroundDimAmount(0.5f)
105105
setImageDrawable(android.R.id.icon, R.mipmap.ic_dialog_tip_finish)
106106
setText(android.R.id.message, "点我消失")
107-
setOnClickListener(android.R.id.message, EasyWindow.OnClickListener<TextView?> { toast: EasyWindow<*>, view: TextView? ->
107+
setOnClickListener(android.R.id.message, EasyWindow.OnClickListener<TextView?> { easyWindow: EasyWindow<*>, view: TextView? ->
108108
// 点击这个 View 后消失
109-
toast.cancel()
109+
easyWindow.cancel()
110110
// 跳转到某个Activity
111-
// toast.startActivity(intent);
111+
// easyWindow.startActivity(intent);
112112
})
113113
}.show()
114114
```
@@ -128,11 +128,11 @@ EasyWindow.with(activity)
128128
//.setBackgroundDimAmount(0.5f)
129129
.setImageDrawable(android.R.id.icon, R.mipmap.ic_dialog_tip_finish)
130130
.setText(android.R.id.message, "点我消失")
131-
.setOnClickListener(android.R.id.message, EasyWindow.OnClickListener<TextView?> { toast: EasyWindow<*>, view: TextView? ->
131+
.setOnClickListener(android.R.id.message, EasyWindow.OnClickListener<TextView?> { easyWindow: EasyWindow<*>, view: TextView? ->
132132
// 点击这个 View 后消失
133-
toast.cancel()
133+
easyWindow.cancel()
134134
// 跳转到某个Activity
135-
// toast.startActivity(intent);
135+
// easyWindow.startActivity(intent);
136136
})
137137
.show()
138138
```

app/build.gradle

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "com.hjq.window.demo"
88
minSdkVersion 16
99
targetSdkVersion 33
10-
versionCode 1003
11-
versionName "10.3"
10+
versionCode 1005
11+
versionName "10.5"
1212
}
1313

1414
// 支持 Java JDK 8
@@ -41,9 +41,9 @@ android {
4141
}
4242
}
4343

44-
applicationVariants.all { variant ->
44+
applicationVariants.configureEach { variant ->
4545
// apk 输出文件名配置
46-
variant.outputs.all { output ->
46+
variant.outputs.configureEach { output ->
4747
outputFileName = rootProject.getName() + '.apk'
4848
}
4949
}
@@ -61,13 +61,13 @@ dependencies {
6161
implementation 'com.google.android.material:material:1.4.0'
6262

6363
// 权限请求框架:https://github.com/getActivity/XXPermissions
64-
implementation 'com.github.getActivity:XXPermissions:18.2'
64+
implementation 'com.github.getActivity:XXPermissions:18.5'
6565

6666
// 标题栏框架:https://github.com/getActivity/TitleBar
6767
implementation 'com.github.getActivity:TitleBar:10.5'
6868

6969
// 吐司框架:https://github.com/getActivity/Toaster
70-
implementation 'com.github.getActivity:Toaster:12.3'
70+
implementation 'com.github.getActivity:Toaster:12.6'
7171

7272
// 内存泄漏捕捉:https://github.com/square/leakcanary
7373
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'

app/src/main/java/com/hjq/window/demo/MainActivity.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@
99
import android.view.WindowManager;
1010
import android.widget.ImageView;
1111
import android.widget.TextView;
12-
1312
import androidx.annotation.NonNull;
1413
import androidx.appcompat.app.AppCompatActivity;
15-
1614
import com.google.android.material.snackbar.Snackbar;
1715
import com.hjq.bar.OnTitleBarListener;
1816
import com.hjq.bar.TitleBar;
@@ -22,8 +20,7 @@
2220
import com.hjq.toast.Toaster;
2321
import com.hjq.window.EasyWindow;
2422
import com.hjq.window.draggable.MovingDraggable;
25-
import com.hjq.window.draggable.SpringDraggable;
26-
23+
import com.hjq.window.draggable.SpringBackDraggable;
2724
import java.util.List;
2825

2926
/**
@@ -105,8 +102,8 @@ public void onClick(View v) {
105102
.setOnClickListener(android.R.id.message, new EasyWindow.OnClickListener<TextView>() {
106103

107104
@Override
108-
public void onClick(EasyWindow<?> window, TextView view) {
109-
window.cancel();
105+
public void onClick(EasyWindow<?> easyWindow, TextView view) {
106+
easyWindow.cancel();
110107
}
111108
})
112109
.show();
@@ -119,15 +116,15 @@ public void onClick(EasyWindow<?> window, TextView view) {
119116
.setAnimStyle(R.style.IOSAnimStyle)
120117
.setImageDrawable(android.R.id.icon, R.drawable.ic_dialog_tip_warning)
121118
.setText(android.R.id.message, "请注意下方 Snackbar")
122-
.setOnToastLifecycle(new EasyWindow.OnWindowLifecycle() {
119+
.setOnWindowLifecycle(new EasyWindow.OnWindowLifecycle() {
123120

124121
@Override
125-
public void onWindowShow(EasyWindow<?> window) {
122+
public void onWindowShow(EasyWindow<?> easyWindow) {
126123
Snackbar.make(getWindow().getDecorView(), "显示回调", Snackbar.LENGTH_SHORT).show();
127124
}
128125

129126
@Override
130-
public void onWindowCancel(EasyWindow<?> window) {
127+
public void onWindowCancel(EasyWindow<?> easyWindow) {
131128
Snackbar.make(getWindow().getDecorView(), "消失回调", Snackbar.LENGTH_SHORT).show();
132129
}
133130
})
@@ -143,12 +140,12 @@ public void onWindowCancel(EasyWindow<?> window) {
143140
.setOnClickListener(android.R.id.message, new EasyWindow.OnClickListener<TextView>() {
144141

145142
@Override
146-
public void onClick(final EasyWindow<?> window, TextView view) {
143+
public void onClick(final EasyWindow<?> easyWindow, TextView view) {
147144
view.setText("不错,很听话");
148-
window.postDelayed(new Runnable() {
145+
easyWindow.postDelayed(new Runnable() {
149146
@Override
150147
public void run() {
151-
window.cancel();
148+
easyWindow.cancel();
152149
}
153150
}, 1000);
154151
}
@@ -166,8 +163,8 @@ public void run() {
166163
.setOnClickListener(android.R.id.message, new EasyWindow.OnClickListener<TextView>() {
167164

168165
@Override
169-
public void onClick(final EasyWindow<?> window, TextView view) {
170-
window.cancel();
166+
public void onClick(final EasyWindow<?> easyWindow, TextView view) {
167+
easyWindow.cancel();
171168
}
172169
})
173170
.showAsDropDown(v, Gravity.BOTTOM);
@@ -181,8 +178,8 @@ public void onClick(final EasyWindow<?> window, TextView view) {
181178
.setOnClickListener(R.id.tv_window_close, new EasyWindow.OnClickListener<TextView>() {
182179

183180
@Override
184-
public void onClick(final EasyWindow<?> window, TextView view) {
185-
window.cancel();
181+
public void onClick(final EasyWindow<?> easyWindow, TextView view) {
182+
easyWindow.cancel();
186183
}
187184
})
188185
.show();
@@ -199,8 +196,8 @@ public void onClick(final EasyWindow<?> window, TextView view) {
199196
.setOnClickListener(android.R.id.message, new EasyWindow.OnClickListener<TextView>() {
200197

201198
@Override
202-
public void onClick(EasyWindow<?> window, TextView view) {
203-
window.cancel();
199+
public void onClick(EasyWindow<?> easyWindow, TextView view) {
200+
easyWindow.cancel();
204201
}
205202
})
206203
.show();
@@ -213,7 +210,8 @@ public void onClick(EasyWindow<?> window, TextView view) {
213210

214211
@Override
215212
public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
216-
showGlobalWindow(getApplication());
213+
// 这里最好要做一下延迟显示,因为在某些手机(华为鸿蒙 3.0)上面立即显示会导致显示效果有一些瑕疵
214+
runOnUiThread(() -> showGlobalWindow(getApplication()));
217215
}
218216

219217
@Override
@@ -252,17 +250,19 @@ public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
252250
* 显示全局弹窗
253251
*/
254252
public static void showGlobalWindow(Application application) {
253+
SpringBackDraggable springBackDraggable = new SpringBackDraggable(SpringBackDraggable.ORIENTATION_HORIZONTAL);
254+
springBackDraggable.setAllowMoveToScreenNotch(false);
255255
// 传入 Application 表示这个是一个全局的 Toast
256256
EasyWindow.with(application)
257257
.setContentView(R.layout.window_phone)
258258
.setGravity(Gravity.END | Gravity.BOTTOM)
259259
.setYOffset(200)
260260
// 设置指定的拖拽规则
261-
.setDraggable(new SpringDraggable(SpringDraggable.ORIENTATION_HORIZONTAL))
261+
.setDraggable(springBackDraggable)
262262
.setOnClickListener(android.R.id.icon, new EasyWindow.OnClickListener<ImageView>() {
263263

264264
@Override
265-
public void onClick(EasyWindow<?> window, ImageView view) {
265+
public void onClick(EasyWindow<?> easyWindow, ImageView view) {
266266
Toaster.show("我被点击了");
267267
// 点击后跳转到拨打电话界面
268268
// Intent intent = new Intent(Intent.ACTION_DIAL);

app/src/main/res/values-v23/styles.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
<item name="android:textAllCaps">false</item>
1414

1515
<!-- <item name="android:windowFullscreen">true</item>-->
16-
<!-- <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>-->
1716
</style>
1817

1918
</resources>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
4+
<!-- Base application theme. -->
5+
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
6+
<!-- Customize your theme here. -->
7+
<item name="colorPrimary">@color/colorPrimary</item>
8+
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
9+
<item name="colorAccent">@color/colorAccent</item>
10+
<item name="android:statusBarColor">@android:color/white</item>
11+
<item name="android:windowLightStatusBar">true</item>
12+
<!-- 解决 Android 5.1 及以上版本 Button 英文字符串自动变大写的问题 -->
13+
<item name="android:textAllCaps">false</item>
14+
15+
<!-- <item name="android:windowFullscreen">true</item>-->
16+
<!-- <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>-->
17+
</style>
18+
19+
</resources>

build.gradle

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,23 @@ allprojects {
2929
jcenter()
3030
}
3131

32-
// 将构建文件统一输出到项目根目录下的 build 文件夹
33-
setBuildDir(new File(rootDir, "build/${path.replaceAll(':', '/')}"))
32+
// 读取 local.properties 文件配置
33+
def properties = new Properties()
34+
def localPropertiesFile = rootProject.file("local.properties")
35+
if (localPropertiesFile.exists()) {
36+
localPropertiesFile.withInputStream { inputStream ->
37+
properties.load(inputStream)
38+
}
39+
}
40+
41+
String buildDirPath = properties.getProperty("build.dir")
42+
if (buildDirPath != null && buildDirPath != "") {
43+
// 将构建文件统一输出到指定的目录下
44+
setBuildDir(new File(buildDirPath, rootProject.name + "/build/${path.replaceAll(':', '/')}"))
45+
} else {
46+
// 将构建文件统一输出到项目根目录下的 build 文件夹
47+
setBuildDir(new File(rootDir, "build/${path.replaceAll(':', '/')}"))
48+
}
3449
}
3550

3651
task clean(type: Delete) {

library/build.gradle

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ android {
55

66
defaultConfig {
77
minSdkVersion 14
8-
versionCode 1003
9-
versionName "10.3"
8+
versionCode 1005
9+
versionName "10.5"
1010
}
1111

1212
// 支持 JDK 1.8
@@ -15,18 +15,14 @@ android {
1515
sourceCompatibility JavaVersion.VERSION_1_8
1616
}
1717

18-
android.libraryVariants.all { variant ->
18+
android.libraryVariants.configureEach { variant ->
1919
// aar 输出文件名配置
20-
variant.outputs.all { output ->
20+
variant.outputs.configureEach { output ->
2121
outputFileName = "${rootProject.name}-${android.defaultConfig.versionName}.aar"
2222
}
2323
}
2424
}
2525

26-
//dependencies {
27-
// compileOnly 'com.android.support:support-annotations:24.0.0'
28-
//}
29-
3026
afterEvaluate {
3127
// 排除 BuildConfig.class 和 R.class
3228
generateReleaseBuildConfig.enabled = false
@@ -35,23 +31,24 @@ afterEvaluate {
3531
generateDebugResValues.enabled = false
3632
}
3733

38-
tasks.withType(Javadoc) {
34+
tasks.withType(Javadoc).configureEach {
3935
options.addStringOption('Xdoclint:none', '-quiet')
4036
options.addStringOption('encoding', 'UTF-8')
4137
options.addStringOption('charSet', 'UTF-8')
4238
}
4339

44-
task sourcesJar(type: Jar) {
40+
tasks.register('sourcesJar', Jar) {
4541
from android.sourceSets.main.java.srcDirs
4642
classifier = 'sources'
4743
}
4844

49-
task javadoc(type: Javadoc) {
45+
tasks.register('javadoc', Javadoc) {
5046
source = android.sourceSets.main.java.srcDirs
5147
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
5248
}
5349

54-
task javadocJar(type: Jar, dependsOn: javadoc) {
50+
tasks.register('javadocJar', Jar) {
51+
dependsOn javadoc
5552
classifier = 'javadoc'
5653
from javadoc.destinationDir
5754
}

library/src/main/java/com/hjq/window/ActivityWindowLifecycle.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414
final class ActivityWindowLifecycle implements Application.ActivityLifecycleCallbacks {
1515

1616
private Activity mActivity;
17-
private EasyWindow<?> mWindow;
17+
private EasyWindow<?> mEasyWindow;
1818

19-
ActivityWindowLifecycle(EasyWindow<?> window, Activity activity) {
19+
ActivityWindowLifecycle(EasyWindow<?> easyWindow, Activity activity) {
2020
mActivity = activity;
21-
mWindow = window;
21+
mEasyWindow = easyWindow;
2222
}
2323

2424
/**
@@ -63,10 +63,10 @@ public void onActivityResumed(Activity activity) {}
6363
@Override
6464
public void onActivityPaused(Activity activity) {
6565
// 一定要在 onPaused 方法中销毁掉,如果放在 onDestroyed 方法中还是有一定几率会导致内存泄露
66-
if (mActivity != activity || !mActivity.isFinishing() || mWindow == null || !mWindow.isShowing()) {
66+
if (mActivity != activity || !mActivity.isFinishing() || mEasyWindow == null || !mEasyWindow.isShowing()) {
6767
return;
6868
}
69-
mWindow.cancel();
69+
mEasyWindow.cancel();
7070
}
7171

7272
@Override
@@ -83,10 +83,10 @@ public void onActivityDestroyed(Activity activity) {
8383
// 释放 Activity 的引用
8484
mActivity = null;
8585

86-
if (mWindow == null) {
86+
if (mEasyWindow == null) {
8787
return;
8888
}
89-
mWindow.recycle();
90-
mWindow = null;
89+
mEasyWindow.recycle();
90+
mEasyWindow = null;
9191
}
9292
}

0 commit comments

Comments
 (0)