android 悬浮窗中监听,android实现可自由移动、监听点击事件的悬浮窗
时间: 2024-02-24 13:55:31 浏览: 128
要实现可自由移动、监听点击事件的悬浮窗,可以通过以下步骤来实现:
1. 在 AndroidManifest.xml 文件中添加悬浮窗权限:
```xml
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
```
2. 创建一个浮动窗口布局的 xml 文件,在其中添加一个可移动的 View 控件和必要的监听事件。
3. 在 Service 中创建 WindowManager 对象,并使用 addView() 方法将浮动窗口布局添加到 WindowManager 中。
4. 在浮动窗口布局的 View 控件中实现 onTouchEvent() 方法,监听触摸事件,并根据触摸事件的坐标改变浮动窗口的位置。
5. 在浮动窗口布局的 View 控件中实现 OnClickListener() 方法,监听点击事件,并执行相应的操作。
6. 在 Service 的 onDestroy() 方法中使用 removeView() 方法将浮动窗口布局从 WindowManager 中移除,释放资源。
下面是一个简单的实现代码示例:
```java
public class FloatWindowService extends Service {
private WindowManager mWindowManager;
private View mFloatView;
private WindowManager.LayoutParams mParams;
@Override
public void onCreate() {
super.onCreate();
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mFloatView = LayoutInflater.from(this).inflate(R.layout.float_window_layout, null);
mParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
mParams.gravity = Gravity.TOP | Gravity.LEFT;
mParams.x = 0;
mParams.y = 0;
mWindowManager.addView(mFloatView, mParams);
// 监听触摸事件,改变浮动窗口位置
mFloatView.setOnTouchListener(new View.OnTouchListener() {
private int mLastX;
private int mLastY;
private int mDownX;
private int mDownY;
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastX = mParams.x;
mLastY = mParams.y;
mDownX = (int) event.getRawX();
mDownY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) event.getRawX();
int moveY = (int) event.getRawY();
int dx = moveX - mDownX;
int dy = moveY - mDownY;
mParams.x = mLastX + dx;
mParams.y = mLastY + dy;
mWindowManager.updateViewLayout(mFloatView, mParams);
break;
}
return false;
}
});
// 监听点击事件
mFloatView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 执行相应的操作
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
mWindowManager.removeView(mFloatView);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
```
阅读全文