Skip to content

Commit ad9fe0d

Browse files
committed
新增英文版的文档和 Demo apk
1 parent f632bed commit ad9fe0d

File tree

15 files changed

+592
-109
lines changed

15 files changed

+592
-109
lines changed

README-en.md

Lines changed: 454 additions & 0 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 10 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# [English Doc](README-en.md)
2+
13
# 悬浮窗框架
24

35
* 项目地址:[Github](https://github.com/getActivity/EasyWindow)
@@ -6,9 +8,9 @@
68

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

9-
![](picture/demo_code.png)
11+
![](picture/zh/demo_code.png)
1012

11-
![](picture/dynamic_figure.gif)
13+
![](picture/zh/dynamic_figure.gif)
1214

1315
#### 本框架意在解决一些悬浮窗的需求,如果是普通的 Toast 封装推荐使用 [Toaster](https://github.com/getActivity/Toaster)
1416

@@ -91,12 +93,7 @@ EasyWindow.with(this)
9193

9294
@Override
9395
public void onClick(@NonNull EasyWindow<?> easyWindow, @NonNull TextView view) {
94-
// 有两种方式取消弹窗:
95-
// 1. easyWindow.cancel:顾名思义,取消显示
96-
// 2. easyWindow.recycle:在取消显示的基础上,加上了回收
97-
// 这两种区别在于,cancel 之后还能 show,但是 recycle 之后不能再 show
98-
// 通常情况下,如果你创建的 EasyWindow 对象在 cancel 之后永远不会再显示,取消弹窗建议直接用 recycle 方法,否则用 cancel 方法
99-
easyWindow.recycle();
96+
easyWindow.cancel();
10097
// 跳转到某个Activity
10198
// easyWindow.startActivity(intent);
10299
}
@@ -122,12 +119,7 @@ EasyWindow.with(activity).apply {
122119
setImageDrawableByImageView(android.R.id.icon, R.mipmap.ic_dialog_tip_finish)
123120
setTextByTextView(android.R.id.message, "点我消失")
124121
setOnClickListenerByView(android.R.id.message, OnWindowViewClickListener<TextView?> { easyWindow: EasyWindow<*>, view: TextView ->
125-
// 有两种方式取消弹窗:
126-
// 1. easyWindow.cancel:顾名思义,取消显示
127-
// 2. easyWindow.recycle:在取消显示的基础上,加上了回收
128-
// 这两种区别在于,cancel 之后还能 show,但是 recycle 之后不能再 show
129-
// 通常情况下,如果你创建的 EasyWindow 对象在 cancel 之后永远不会再显示,取消弹窗建议直接用 recycle 方法,否则用 cancel 方法
130-
easyWindow.recycle()
122+
easyWindow.cancel()
131123
// 跳转到某个Activity
132124
// easyWindow.startActivity(intent)
133125
})
@@ -150,12 +142,7 @@ EasyWindow.with(activity)
150142
.setImageDrawableByImageView(android.R.id.icon, R.mipmap.ic_dialog_tip_finish)
151143
.setTextByTextView(android.R.id.message, "点我消失")
152144
.setOnClickListenerByView(android.R.id.message, OnWindowViewClickListener<TextView?> { easyWindow: EasyWindow<*>, view: TextView ->
153-
// 有两种方式取消弹窗:
154-
// 1. easyWindow.cancel:顾名思义,取消显示
155-
// 2. easyWindow.recycle:在取消显示的基础上,加上了回收
156-
// 这两种区别在于,cancel 之后还能 show,但是 recycle 之后不能再 show
157-
// 通常情况下,如果你创建的 EasyWindow 对象在 cancel 之后永远不会再显示,取消弹窗建议直接用 recycle 方法,否则用 cancel 方法
158-
easyWindow.recycle()
145+
easyWindow.cancel()
159146
// 跳转到某个Activity
160147
// easyWindow.startActivity(intent)
161148
})
@@ -184,23 +171,7 @@ public final class WindowLifecycleControl implements Application.ActivityLifecyc
184171
.show();
185172
}
186173

187-
@Override
188-
public void onActivityStarted(Activity activity) {}
189-
190-
@Override
191-
public void onActivityResumed(Activity activity) {}
192-
193-
@Override
194-
public void onActivityPaused(Activity activity) {}
195-
196-
@Override
197-
public void onActivityStopped(Activity activity) {}
198-
199-
@Override
200-
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
201-
202-
@Override
203-
public void onActivityDestroyed(Activity activity) {}
174+
......
204175
}
205176
```
206177

@@ -438,6 +409,8 @@ EasyWindowManager.getAllWindowInstance();
438409

439410
* 标题栏框架:[TitleBar](https://github.com/getActivity/TitleBar) ![](https://img.shields.io/github/stars/getActivity/TitleBar.svg) ![](https://img.shields.io/github/forks/getActivity/TitleBar.svg)
440411

412+
* 设备兼容框架:[DeviceCompat](https://github.com/getActivity/DeviceCompat) ![](https://img.shields.io/github/stars/getActivity/DeviceCompat.svg) ![](https://img.shields.io/github/forks/getActivity/DeviceCompat.svg)
413+
441414
* ShapeView 框架:[ShapeView](https://github.com/getActivity/ShapeView) ![](https://img.shields.io/github/stars/getActivity/ShapeView.svg) ![](https://img.shields.io/github/forks/getActivity/ShapeView.svg)
442415

443416
* ShapeDrawable 框架:[ShapeDrawable](https://github.com/getActivity/ShapeDrawable) ![](https://img.shields.io/github/stars/getActivity/ShapeDrawable.svg) ![](https://img.shields.io/github/forks/getActivity/ShapeDrawable.svg)

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

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ protected void onCreate(Bundle savedInstanceState) {
7171
findViewById(R.id.btn_main_draggable).setOnClickListener(this);
7272
findViewById(R.id.btn_main_global).setOnClickListener(this);
7373
findViewById(R.id.btn_main_semi_stealth).setOnClickListener(this);
74-
findViewById(R.id.btn_main_utils).setOnClickListener(this);
74+
findViewById(R.id.btn_main_toaster_example).setOnClickListener(this);
7575
findViewById(R.id.btn_main_cancel_all).setOnClickListener(this);
7676

7777
TitleBar titleBar = findViewById(R.id.tb_main_bar);
@@ -102,7 +102,7 @@ public void onClick(View v) {
102102
.setContentView(R.layout.window_hint)
103103
.setWindowAnim(R.style.TopAnimStyle)
104104
.setImageDrawableByImageView(android.R.id.icon, R.drawable.ic_dialog_tip_finish)
105-
.setTextByTextView(android.R.id.message, "这个动画是不是很骚")
105+
.setTextByTextView(android.R.id.message, getString(R.string.demo_animation_cool))
106106
.show();
107107

108108
} else if (viewId == R.id.btn_main_duration) {
@@ -112,7 +112,7 @@ public void onClick(View v) {
112112
.setContentView(R.layout.window_hint)
113113
.setWindowAnim(R.style.IOSAnimStyle)
114114
.setImageDrawableByImageView(android.R.id.icon, R.drawable.ic_dialog_tip_error)
115-
.setTextByTextView(android.R.id.message, "一秒后自动消失")
115+
.setTextByTextView(android.R.id.message, getString(R.string.demo_auto_dismiss))
116116
.show();
117117

118118
} else if (viewId == R.id.btn_main_overlay) {
@@ -121,7 +121,7 @@ public void onClick(View v) {
121121
.setContentView(R.layout.window_hint)
122122
.setWindowAnim(R.style.IOSAnimStyle)
123123
.setImageDrawableByImageView(android.R.id.icon, R.drawable.ic_dialog_tip_finish)
124-
.setTextByTextView(android.R.id.message, "点我消失")
124+
.setTextByTextView(android.R.id.message, getString(R.string.demo_click_to_dismiss))
125125
// 设置外层是否能被触摸
126126
.setOutsideTouchable(false)
127127
// 设置窗口背景阴影强度
@@ -142,17 +142,17 @@ public void onClick(@NonNull EasyWindow<?> easyWindow, @NonNull TextView view) {
142142
.setContentView(R.layout.window_hint)
143143
.setWindowAnim(R.style.IOSAnimStyle)
144144
.setImageDrawableByImageView(android.R.id.icon, R.drawable.ic_dialog_tip_warning)
145-
.setTextByTextView(android.R.id.message, "请注意下方 Snackbar")
145+
.setTextByTextView(android.R.id.message, getString(R.string.demo_notice_snackbar))
146146
.setOnWindowLifecycleCallback(new OnWindowLifecycleCallback() {
147147

148148
@Override
149149
public void onWindowShow(@NonNull EasyWindow<?> easyWindow) {
150-
Snackbar.make(getWindow().getDecorView(), "显示回调", Snackbar.LENGTH_SHORT).show();
150+
Snackbar.make(getWindow().getDecorView(), getString(R.string.demo_callback_show), Snackbar.LENGTH_SHORT).show();
151151
}
152152

153153
@Override
154154
public void onWindowCancel(@NonNull EasyWindow<?> easyWindow) {
155-
Snackbar.make(getWindow().getDecorView(), "消失回调", Snackbar.LENGTH_SHORT).show();
155+
Snackbar.make(getWindow().getDecorView(), getString(R.string.demo_dismiss_callback), Snackbar.LENGTH_SHORT).show();
156156
}
157157
})
158158
.show();
@@ -164,7 +164,7 @@ public void onWindowCancel(@NonNull EasyWindow<?> easyWindow) {
164164
.setWindowAnim(R.style.RightAnimStyle)
165165
.setImageDrawableByImageView(android.R.id.icon, R.drawable.ic_dialog_tip_finish)
166166
.setWindowDuration(2000)
167-
.setTextByTextView(android.R.id.message, "位置算得准不准")
167+
.setTextByTextView(android.R.id.message, getString(R.string.demo_text_position_accuracy))
168168
.setOnClickListenerByView(android.R.id.message, new OnWindowViewClickListener<TextView>() {
169169

170170
@Override
@@ -246,7 +246,7 @@ public void onClick(@NonNull EasyWindow<?> easyWindow, @NonNull ImageView view)
246246

247247
@Override
248248
public boolean onLongClick(@NonNull EasyWindow<?> easyWindow, @NonNull View view) {
249-
Toaster.show("关闭按钮被长按了");
249+
Toaster.show(getString(R.string.demo_close_button_long_press));
250250
return false;
251251
}
252252
})
@@ -282,21 +282,21 @@ public void onWindowLayoutInflateFinished(@NonNull EasyWindow<?> easyWindow, @No
282282

283283
List<String> dataList = new ArrayList<>();
284284
for (int i = 1; i <= 20; i++) {
285-
dataList.add("我是条目 " + i);
285+
dataList.add(getString(R.string.demo_item_prefix) + " " + i);
286286
}
287287

288288
DemoAdapter adapter = new DemoAdapter(dataList);
289289
adapter.setOnItemClickListener(new OnItemClickListener() {
290290

291291
@Override
292292
public void onItemClick(View itemView, int position) {
293-
Toaster.show("条目 " + (position + 1) + " 被点击了");
293+
Toaster.show(getString(R.string.demo_item_clicked, (position + 1)));
294294
}
295295
});
296296
adapter.setOnItemLongClickListener(new OnItemLongClickListener() {
297297
@Override
298298
public boolean onItemLongClick(View itemView, int position) {
299-
Toaster.show("条目 " + (position + 1) + " 被长按了");
299+
Toaster.show(getString(R.string.demo_item_long_pressed, (position + 1)));
300300
return false;
301301
}
302302
});
@@ -370,7 +370,7 @@ public void onDenied(@NonNull List<IPermission> permissions, boolean doNotAskAga
370370
// 回收当前正在显示的悬浮窗
371371
EasyWindowManager.recycleAllWindow();
372372

373-
} else if (viewId == R.id.btn_main_utils) {
373+
} else if (viewId == R.id.btn_main_toaster_example) {
374374

375375
EasyWindow.with(this)
376376
// 将 Toaster 中的 View 转移给 EasyWindow 来显示
@@ -430,7 +430,7 @@ public void onWindowDraggingStop(@NonNull EasyWindow<?> easyWindow) {
430430

431431
@Override
432432
public void onClick(@NonNull EasyWindow<?> easyWindow, @NonNull ImageView view) {
433-
Toaster.show("我被点击了");
433+
Toaster.show(R.string.demo_toast_click);
434434
// 点击后跳转到拨打电话界面
435435
// Intent intent = new Intent(Intent.ACTION_DIAL);
436436
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -443,8 +443,9 @@ public void onClick(@NonNull EasyWindow<?> easyWindow, @NonNull ImageView view)
443443

444444
@Override
445445
public boolean onLongClick(@NonNull EasyWindow<?> easyWindow, @NonNull ImageView view) {
446-
Toaster.show("我被长按了");
447-
return false;
446+
Toaster.show(R.string.demo_toast_long_press);
447+
// 这里返回 true 就不会触发点击事件
448+
return true;
448449
}
449450
})
450451
.show();

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

Lines changed: 14 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -71,17 +71,9 @@ public void postStayEdgeRunnable() {
7171
}
7272

7373
if (isLeftShow()) {
74-
if (isTopShow()) {
75-
hideHalfView(Gravity.TOP);
76-
} else {
77-
hideHalfView(Gravity.LEFT);
78-
}
74+
hideHalfView(Gravity.LEFT);
7975
} else {
80-
if (isTopShow()) {
81-
hideHalfView(Gravity.TOP);
82-
} else {
83-
hideHalfView(Gravity.RIGHT);
84-
}
76+
hideHalfView(Gravity.RIGHT);
8577
}
8678
};
8779

@@ -110,7 +102,7 @@ private void hideHalfView(int gravity) {
110102
WindowManager.LayoutParams windowParams = getWindowParams();
111103
windowDraggableRule.updateLocation(windowParams.x - viewWidth / 2f, windowParams.y, true);
112104
} else {
113-
int offSet = getWindowViewWidth() / 2; //用小球来做偏移
105+
int offSet = getWindowViewWidth() / 2;
114106
clipBounds.set(offSet, 0, viewWidth, viewHeight);
115107
// 设置画板偏移
116108
windowRootLayout.setTranslationX(-offSet);
@@ -128,15 +120,6 @@ private void hideHalfView(int gravity) {
128120
// 设置裁剪区域
129121
windowRootLayout.setClipBounds(clipBounds);
130122
break;
131-
case Gravity.TOP:
132-
int offSetHeight = viewHeight / 2;
133-
clipBounds.set(0, offSetHeight, viewWidth, viewHeight);
134-
// 设置画板偏移
135-
windowRootLayout.setTranslationX(0);
136-
windowRootLayout.setTranslationY(-offSetHeight);
137-
// 设置裁剪区域
138-
windowRootLayout.setClipBounds(clipBounds);
139-
break;
140123
default:
141124
break;
142125
}
@@ -154,7 +137,7 @@ private void showFullView() {
154137
return;
155138
}
156139
Rect safeInsetRect = windowDraggableRule.getSafeInsetRect();
157-
if (safeInsetRect != null && safeInsetRect.left > 0 && !isTopShow()) {
140+
if (safeInsetRect != null && safeInsetRect.left > 0) {
158141
WindowManager.LayoutParams windowParams = getWindowParams();
159142
windowDraggableRule.updateLocation(windowParams.x + viewWidth / 2f, windowParams.y, false);
160143
}
@@ -175,7 +158,7 @@ private boolean isFullShowView() {
175158
return true;
176159
}
177160
Rect safeInsetRect = windowDraggableRule.getSafeInsetRect();
178-
if (safeInsetRect != null && safeInsetRect.left > 0 && !isTopShow()) {
161+
if (safeInsetRect != null && safeInsetRect.left > 0) {
179162
if (getWindowParams().x < safeInsetRect.left) {
180163
return false;
181164
}
@@ -197,24 +180,21 @@ private boolean isFullShowView() {
197180
}
198181

199182
/**
200-
* 悬浮球是否靠顶显示
183+
* 获取当前屏幕宽度
201184
*/
202-
private boolean isTopShow() {
203-
WindowManager.LayoutParams windowParams = getWindowParams();
204-
if (isLeftShow()) {
205-
return windowParams.x > windowParams.y;
206-
} else {
207-
return getScreenWidth() - windowParams.x - getWindowViewWidth() > windowParams.y;
208-
}
209-
}
210-
211185
private int getScreenWidth() {
212186
Context context = getContext();
213187
if (context == null) {
214188
return 0;
215189
}
216-
Resources resources = getContext().getResources();
190+
Resources resources = context.getResources();
191+
if (resources == null) {
192+
return 0;
193+
}
217194
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
195+
if (displayMetrics == null) {
196+
return 0;
197+
}
218198
return displayMetrics.widthPixels;
219199
}
220200

@@ -262,7 +242,7 @@ public void onClick(@NonNull EasyWindow<?> easyWindow, @NonNull View view) {
262242
postStayEdgeRunnable();
263243
return;
264244
}
265-
Toaster.show("我被点击了");
245+
Toaster.show(R.string.demo_toast_click);
266246
}
267247

268248
/** {@link OnWindowLifecycleCallback} */

0 commit comments

Comments
 (0)