android java开发一个悬浮窗
时间: 2024-05-03 19:21:58 浏览: 149
以下是一个简单的悬浮窗示例代码,可以在Android应用中使用:
```
public class FloatingWindowService extends Service {
private WindowManager mWindowManager;
private View mFloatingView;
public FloatingWindowService() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
super.onCreate();
// 初始化悬浮窗视图
mFloatingView = LayoutInflater.from(this).inflate(R.layout.floating_window_layout, null);
// 设置悬浮窗参数
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
// 设置悬浮窗位置
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
// 添加悬浮窗视图到窗口管理器
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mWindowManager.addView(mFloatingView, params);
// 设置悬浮窗视图事件监听
mFloatingView.setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 记录初始位置和触摸点位置
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
// 如果移动距离很小,则视为单击事件,执行相应操作
if (Math.abs(event.getRawX() - initialTouchX) < 5 && Math.abs(event.getRawY() - initialTouchY) < 5) {
// TODO 执行单击事件
}
return true;
case MotionEvent.ACTION_MOVE:
// 计算移动距离并更新悬浮窗位置
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
mWindowManager.updateViewLayout(mFloatingView, params);
return true;
}
return false;
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
// 从窗口管理器中移除悬浮窗视图
if (mFloatingView != null) {
mWindowManager.removeView(mFloatingView);
}
}
}
```
在上述代码中,首先定义了一个`FloatingWindowService`服务类,该类继承自`Service`,并实现了`onCreate()`、`onStartCommand()`和`onDestroy()`方法。在`onCreate()`方法中,初始化了悬浮窗视图,并设置了悬浮窗参数和位置,然后将悬浮窗视图添加到窗口管理器中。同时,也设置了悬浮窗视图的事件监听,以便实现拖拽和单击操作。
在`onDestroy()`方法中,从窗口管理器中移除了悬浮窗视图。
需要注意的是,为了在Android 8.0及以上版本中显示悬浮窗,需要使用`WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY`类型的窗口。此外,还需要在应用的`AndroidManifest.xml`文件中添加`<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />`权限声明。
阅读全文