Skip to content

Commit 8dadf58

Browse files
committed
优化判断 View 是否移动代码的逻辑
1 parent ce90c9e commit 8dadf58

File tree

7 files changed

+49
-38
lines changed

7 files changed

+49
-38
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ allprojects {
3232
```groovy
3333
dependencies {
3434
// 悬浮窗框架:https://github.com/getActivity/XToast
35-
implementation 'com.github.getActivity:XToast:8.0'
35+
implementation 'com.github.getActivity:XToast:8.1'
3636
}
3737
```
3838

XToast.apk

34 Bytes
Binary file not shown.

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "com.hjq.xtoast.demo"
88
minSdkVersion 16
99
targetSdkVersion 30
10-
versionCode 80
11-
versionName "8.0"
10+
versionCode 81
11+
versionName "8.1"
1212
}
1313
buildTypes {
1414
release {

library/build.gradle

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

66
defaultConfig {
77
minSdkVersion 14
8-
versionCode 80
9-
versionName "8.0"
8+
versionCode 81
9+
versionName "8.1"
1010
}
1111

1212
android.libraryVariants.all { variant ->

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

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package com.hjq.xtoast.draggable;
22

3-
import android.content.Context;
43
import android.graphics.Rect;
54
import android.view.Gravity;
65
import android.view.View;
7-
import android.view.ViewConfiguration;
86
import android.view.WindowManager;
97

108
import com.hjq.xtoast.XToast;
@@ -50,6 +48,24 @@ protected View getRootView() {
5048
return mRootView;
5149
}
5250

51+
/**
52+
* 获取当前 Window 的宽度
53+
*/
54+
protected int getWindowWidth() {
55+
Rect rect = new Rect();
56+
getRootView().getWindowVisibleDisplayFrame(rect);
57+
return rect.right - rect.left;
58+
}
59+
60+
/**
61+
* 获取当前 Window 的高度
62+
*/
63+
protected int getWindowHeight() {
64+
Rect rect = new Rect();
65+
getRootView().getWindowVisibleDisplayFrame(rect);
66+
return rect.bottom - rect.top;
67+
}
68+
5369
/**
5470
* 获取窗口不可见的宽度,一般情况下为横屏状态下刘海的高度
5571
*/
@@ -111,8 +127,7 @@ protected void updateLocation(int x, int y) {
111127
* @param downY 手指按下时的 y 坐标
112128
* @param upY 手指抬起时的 y 坐标
113129
*/
114-
protected boolean isTouchMove(Context context, float downX, float upX, float downY, float upY) {
115-
return Math.abs(downX - upX) > ViewConfiguration.get(context).getScaledTouchSlop() ||
116-
Math.abs(downY - upY) > ViewConfiguration.get(context).getScaledTouchSlop();
130+
protected boolean isTouchMove(float downX, float upX, float downY, float upY) {
131+
return Math.abs(downX - upX) >= 1f || Math.abs(downY - upY) >= 1f;
117132
}
118133
}

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ public class MovingDraggable extends BaseDraggable {
1616
private float mViewDownX;
1717
private float mViewDownY;
1818

19+
/** 触摸移动标记 */
20+
private boolean mMoveTouch;
21+
1922
@SuppressLint("ClickableViewAccessibility")
2023
@Override
2124
public boolean onTouch(View v, MotionEvent event) {
@@ -24,6 +27,7 @@ public boolean onTouch(View v, MotionEvent event) {
2427
// 记录按下的位置(相对 View 的坐标)
2528
mViewDownX = event.getX();
2629
mViewDownY = event.getY();
30+
mMoveTouch = false;
2731
break;
2832
case MotionEvent.ACTION_MOVE:
2933
// 记录移动的位置(相对屏幕的坐标)
@@ -32,10 +36,15 @@ public boolean onTouch(View v, MotionEvent event) {
3236

3337
// 更新移动的位置
3438
updateLocation(rawMoveX - mViewDownX, rawMoveY - mViewDownY);
39+
40+
if (!mMoveTouch && isTouchMove(mViewDownX, event.getX(), mViewDownY, event.getY())) {
41+
// 如果用户移动了手指,那么就拦截本次触摸事件,从而不让点击事件生效
42+
mMoveTouch = true;
43+
}
3544
break;
3645
case MotionEvent.ACTION_UP:
37-
// 如果用户移动了手指,那么就拦截本次触摸事件,从而不让点击事件生效
38-
return isTouchMove(v.getContext(), mViewDownX, event.getX(), mViewDownY, event.getY());
46+
case MotionEvent.ACTION_CANCEL:
47+
return mMoveTouch;
3948
default:
4049
break;
4150
}

library/src/main/java/com/hjq/xtoast/draggable/SpringDraggable.java

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22

33
import android.animation.ValueAnimator;
44
import android.annotation.SuppressLint;
5-
import android.util.DisplayMetrics;
65
import android.view.MotionEvent;
76
import android.view.View;
8-
import android.view.WindowManager;
97
import android.widget.LinearLayout;
108

119
/**
@@ -23,6 +21,9 @@ public class SpringDraggable extends BaseDraggable {
2321
/** 回弹的方向 */
2422
private final int mOrientation;
2523

24+
/** 触摸移动标记 */
25+
private boolean mMoveTouch;
26+
2627
public SpringDraggable() {
2728
this(LinearLayout.HORIZONTAL);
2829
}
@@ -49,6 +50,7 @@ public boolean onTouch(View v, MotionEvent event) {
4950
// 记录按下的位置(相对 View 的坐标)
5051
mViewDownX = event.getX();
5152
mViewDownY = event.getY();
53+
mMoveTouch = false;
5254
break;
5355
case MotionEvent.ACTION_MOVE:
5456
// 记录移动的位置(相对屏幕的坐标)
@@ -57,8 +59,14 @@ public boolean onTouch(View v, MotionEvent event) {
5759

5860
// 更新移动的位置
5961
updateLocation(rawMoveX - mViewDownX, rawMoveY - mViewDownY);
62+
63+
if (!mMoveTouch && isTouchMove(mViewDownX, event.getX(), mViewDownY, event.getY())) {
64+
// 如果用户移动了手指,那么就拦截本次触摸事件,从而不让点击事件生效
65+
mMoveTouch = true;
66+
}
6067
break;
6168
case MotionEvent.ACTION_UP:
69+
case MotionEvent.ACTION_CANCEL:
6270
// 记录移动的位置(相对屏幕的坐标)
6371
rawMoveX = event.getRawX() - getWindowInvisibleWidth();
6472
rawMoveY = event.getRawY() - getWindowInvisibleHeight();
@@ -68,7 +76,7 @@ public boolean onTouch(View v, MotionEvent event) {
6876
case LinearLayout.HORIZONTAL:
6977
final float rawFinalX;
7078
// 获取当前屏幕的宽度
71-
int screenWidth = getScreenWidth();
79+
int screenWidth = getWindowWidth();
7280
if (rawMoveX < screenWidth / 2f) {
7381
// 回弹到屏幕左边
7482
rawFinalX = 0f;
@@ -82,7 +90,7 @@ public boolean onTouch(View v, MotionEvent event) {
8290
case LinearLayout.VERTICAL:
8391
final float rawFinalY;
8492
// 获取当前屏幕的高度
85-
int screenHeight = getScreenHeight();
93+
int screenHeight = getWindowHeight();
8694
if (rawMoveY < screenHeight / 2f) {
8795
// 回弹到屏幕顶部
8896
rawFinalY = 0f;
@@ -96,34 +104,13 @@ public boolean onTouch(View v, MotionEvent event) {
96104
default:
97105
break;
98106
}
99-
// 如果用户移动了手指,那么就拦截本次触摸事件,从而不让点击事件生效
100-
return isTouchMove(v.getContext(), mViewDownX, event.getX(), mViewDownY, event.getY());
107+
return mMoveTouch;
101108
default:
102109
break;
103110
}
104111
return false;
105112
}
106113

107-
/**
108-
* 获取屏幕的宽度
109-
*/
110-
private int getScreenWidth() {
111-
WindowManager manager = getWindowManager();
112-
DisplayMetrics outMetrics = new DisplayMetrics();
113-
manager.getDefaultDisplay().getMetrics(outMetrics);
114-
return outMetrics.widthPixels;
115-
}
116-
117-
/**
118-
* 获取屏幕的高度
119-
*/
120-
private int getScreenHeight() {
121-
WindowManager manager = getWindowManager();
122-
DisplayMetrics outMetrics = new DisplayMetrics();
123-
manager.getDefaultDisplay().getMetrics(outMetrics);
124-
return outMetrics.heightPixels;
125-
}
126-
127114
/**
128115
* 执行水平回弹动画
129116
*

0 commit comments

Comments
 (0)