在Android中,使用WindowManager
创建系统悬浮窗需要以下几个步骤:
1.权限声明:在AndroidManifest.xml
中声明SYSTEM_ALERT_WINDOW
权限。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
2.检查权限:从Android 6.0 (API级别23) 开始,你需要在运行时请求用户授权。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(context)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
}
}
3.创建悬浮窗:使用WindowManager
和LayoutParams
来定义悬浮窗的布局。
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams params = 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);
View floatingView = LayoutInflater.from(this).inflate(R.layout.floating_view_layout, null);
windowManager.addView(floatingView, params);
4.处理悬浮窗的交互:例如,让悬浮窗能够拖动。
floatingView.setOnTouchListener(new View.OnTouchListener() {
private int initialX, initialY;
private float initialTouchX, 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_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(floatingView, params);
return true;
}
return false;
}
});
5.移除悬浮窗:当不再需要时,通过WindowManager.removeView()
来移除悬浮窗。
if (floatingView != null) {
windowManager.removeView(floatingView);
}