Skip to content

Commit 2c696a0

Browse files
committed
优化触摸移动悬浮窗的代码逻辑
1 parent 60abd21 commit 2c696a0

File tree

3 files changed

+55
-13
lines changed

3 files changed

+55
-13
lines changed

library/src/main/java/com/hjq/window/draggable/BaseDraggable.java

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
import android.view.Gravity;
1212
import android.view.View;
1313
import android.view.View.OnLayoutChangeListener;
14+
import android.view.View.OnTouchListener;
1415
import android.view.Window;
1516
import android.view.WindowInsets;
1617
import android.view.WindowManager;
18+
import android.view.WindowManager.LayoutParams;
1719
import com.hjq.window.EasyWindow;
1820

1921
/**
@@ -22,7 +24,7 @@
2224
* time : 2019/01/04
2325
* desc : 拖拽抽象类
2426
*/
25-
public abstract class BaseDraggable implements View.OnTouchListener {
27+
public abstract class BaseDraggable implements OnTouchListener {
2628

2729
private EasyWindow<?> mEasyWindow;
2830
private View mDecorView;
@@ -43,7 +45,12 @@ public abstract class BaseDraggable implements View.OnTouchListener {
4345
private int mCurrentWindowInvisibleHeight;
4446

4547
/**
46-
* Toast 显示后回调这个类
48+
* 判断当前是否处于触摸移动状态
49+
*/
50+
public abstract boolean isTouchMoving();
51+
52+
/**
53+
* 窗口显示后回调这个方法
4754
*/
4855
@SuppressLint("ClickableViewAccessibility")
4956
public void start(EasyWindow<?> easyWindow) {
@@ -132,7 +139,21 @@ public int getViewOnScreenY() {
132139
* 刷新当前 Window 信息
133140
*/
134141
public void refreshWindowInfo() {
135-
View decorView = getDecorView();
142+
Context context = mEasyWindow.getContext();
143+
if (context == null) {
144+
return;
145+
}
146+
147+
View decorView = null;
148+
149+
if (context instanceof Activity) {
150+
decorView = ((Activity) context).getWindow().getDecorView();
151+
}
152+
153+
if (decorView == null) {
154+
decorView = getDecorView();
155+
}
156+
136157
if (decorView == null) {
137158
return;
138159
}
@@ -146,8 +167,8 @@ public void refreshWindowInfo() {
146167
mCurrentWindowWidth = mTempRect.right - mTempRect.left;
147168
mCurrentWindowHeight = mTempRect.bottom - mTempRect.top;
148169

149-
mCurrentWindowInvisibleWidth = mTempRect.left;
150-
mCurrentWindowInvisibleHeight = mTempRect.top;
170+
mCurrentWindowInvisibleWidth = Math.max(mTempRect.left, 0);
171+
mCurrentWindowInvisibleHeight = Math.max(mTempRect.top, 0);
151172

152173
/*
153174
Log.i(getClass().getSimpleName(),
@@ -422,6 +443,13 @@ protected boolean isFingerMove(float downX, float upX, float downY, float upY) {
422443
return Math.abs(downX - upX) >= minTouchSlop || Math.abs(downY - upY) >= minTouchSlop;
423444
}
424445

446+
/**
447+
* 判断当前悬浮窗是否可以移动到屏幕之外的地方
448+
*/
449+
protected boolean isSupportMoveOffScreen() {
450+
return mEasyWindow.hasWindowFlags(LayoutParams.FLAG_LAYOUT_NO_LIMITS);
451+
}
452+
425453
/**
426454
* 获取最小触摸距离
427455
*/

library/src/main/java/com/hjq/window/draggable/MovingDraggable.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,14 @@ public boolean onTouch(View v, MotionEvent event) {
3434
float rawMoveX = event.getRawX() - getWindowInvisibleWidth();
3535
float rawMoveY = event.getRawY() - getWindowInvisibleHeight();
3636

37-
float newX = Math.max(rawMoveX - mViewDownX, 0);
38-
float newY = Math.max(rawMoveY - mViewDownY, 0);
37+
float newX = rawMoveX - mViewDownX;
38+
float newY = rawMoveY - mViewDownY;
39+
40+
// 判断当前是否支持移动到屏幕外
41+
if (!isSupportMoveOffScreen()) {
42+
newX = Math.max(newX, 0);
43+
newY = Math.max(newY, 0);
44+
}
3945

4046
// 更新移动的位置
4147
updateLocation(newX, newY);
@@ -62,12 +68,13 @@ public boolean onTouch(View v, MotionEvent event) {
6268
default:
6369
break;
6470
}
65-
return false;
71+
return mTouchMoving;
6672
}
6773

6874
/**
6975
* 当前是否处于触摸移动状态
7076
*/
77+
@Override
7178
public boolean isTouchMoving() {
7279
return mTouchMoving;
7380
}

library/src/main/java/com/hjq/window/draggable/SpringBackDraggable.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,14 @@ public boolean onTouch(View v, MotionEvent event) {
6666
float rawMoveX = event.getRawX() - getWindowInvisibleWidth();
6767
float rawMoveY = event.getRawY() - getWindowInvisibleHeight();
6868

69-
float newX = Math.max(rawMoveX - mViewDownX, 0);
70-
float newY = Math.max(rawMoveY - mViewDownY, 0);
69+
float newX = rawMoveX - mViewDownX;
70+
float newY = rawMoveY - mViewDownY;
71+
72+
// 判断当前是否支持移动到屏幕外
73+
if (!isSupportMoveOffScreen()) {
74+
newX = Math.max(newX, 0);
75+
newY = Math.max(newY, 0);
76+
}
7177

7278
// 更新移动的位置
7379
updateLocation(newX, newY);
@@ -95,7 +101,7 @@ public boolean onTouch(View v, MotionEvent event) {
95101
default:
96102
break;
97103
}
98-
return false;
104+
return mTouchMoving;
99105
}
100106

101107
/**
@@ -284,6 +290,7 @@ protected void dispatchSpringBackAnimationEndCallback(Animator animator) {
284290
/**
285291
* 当前是否处于触摸移动状态
286292
*/
293+
@Override
287294
public boolean isTouchMoving() {
288295
return mTouchMoving;
289296
}
@@ -293,11 +300,11 @@ public interface SpringBackAnimCallback {
293300
/**
294301
* 回弹动画开始执行
295302
*/
296-
void onSpringBackAnimationStart(EasyWindow<?> easyWindow, Animator animator);
303+
default void onSpringBackAnimationStart(EasyWindow<?> easyWindow, Animator animator) {}
297304

298305
/**
299306
* 回弹动画结束执行
300307
*/
301-
void onSpringBackAnimationEnd(EasyWindow<?> easyWindow, Animator animator);
308+
default void onSpringBackAnimationEnd(EasyWindow<?> easyWindow, Animator animator) {}
302309
}
303310
}

0 commit comments

Comments
 (0)