FloatView.java
2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package com.cnlive.demo.stream;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.RelativeLayout;
/**
* Created by Lynn on 2017/9/19.
*/
public class FloatView extends RelativeLayout {
private float mTouchStartX;
private float mTouchStartY;
private float mLastX;
private float mLastY;
private float mMaxX = 0;
private float mMaxY = 0;
private WindowManager mWindowManager;
private WindowManager.LayoutParams mWmParams;
public FloatView(Context context) {
super(context);
init();
}
public FloatView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public FloatView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void setWmParams(WindowManager.LayoutParams params) {
mWmParams = params;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//获取相对屏幕的坐标,即以屏幕左上角为原点
mLastX = event.getRawX();
mLastY = event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//获取相对View的坐标,即以此View左上角为原点
mTouchStartX = event.getX();
mTouchStartY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
updateViewPosition();
break;
case MotionEvent.ACTION_UP:
mTouchStartX = 0;
mTouchStartY = 0;
break;
}
return true;
}
private void init() {
mWindowManager = (WindowManager) getContext().getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE);
}
private void updateViewPosition() {
if (mWmParams != null) {
mMaxX = mWindowManager.getDefaultDisplay().getWidth() - this.getWidth();
mMaxY = mWindowManager.getDefaultDisplay().getHeight() - this.getHeight();
//更新浮动窗口位置参数
float newX = (mLastX - mTouchStartX);
float newY = (mLastY - mTouchStartY);
//以屏幕左上角为原点
mWmParams.gravity = Gravity.LEFT | Gravity.TOP;
//不能移除屏幕最左边和最上边
if (newX < 0) {
newX = 0;
}
if (newY < 0) {
newY = 0;
}
//不能移出屏幕最右边和最下边
if (newX > mMaxX) {
newX = mMaxX;
}
if (newY > mMaxY) {
newY = mMaxY;
}
mWmParams.x = (int) newX;
mWmParams.y = (int) newY;
mWindowManager.updateViewLayout(this, mWmParams); //刷新显示
}
}
}