有时播放视频或者拨打微信、QQ电话时,当我们退出界面后会弹出一个悬浮窗继续播放视频或显示通话时间。下面将介绍如何创建一个悬浮窗。
点击安卓悬浮窗官方介绍链接,可以打开查看官方介绍。下面我直接说明一下在我的代码中实现这个功能组要注意的一些点(最后附有工程代码链接,直接下载去用就行了,千万别自己倒腾浪费时间干嘛)。
权限申请
在AndroidManifest.xml文件中声明悬浮窗权限,操作如下:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
声明全局Application类
创建悬浮窗需要调用系统服务,在此创建一个全局的应用程序的主应用类用于获取窗口管理器。因此在AndroidManifest.xml的application节点声明全局应用类如下:
<application android:name=".MainApplication">
申请悬浮窗权限
在主界面MainActivity.java
代码onCreate
函数中申请悬浮窗权限,代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
// AndroidManifest.xml要先声明悬浮窗权限SYSTEM_ALERT_WINDOW
// AppOpsManager.OP_SYSTEM_ALERT_WINDOW是隐藏变量(值为24),不能直接引用
if (!AuthorityUtil.checkOp(this, 24)) { // 未开启悬浮窗权限
Toast.makeText(this, "请先给该应用开启悬浮窗权限", Toast.LENGTH_SHORT).show();
// 跳到悬浮窗权限的设置页面
AuthorityUtil.requestAlertWindowPermission(this);
}
}
显示悬浮窗
在主界面MainActivity.java
代码onCreate
函数中申请悬浮窗权限后便可以调用openFloatWindow
函数显示悬浮窗,代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
// AndroidManifest.xml要先声明悬浮窗权限SYSTEM_ALERT_WINDOW
// AppOpsManager.OP_SYSTEM_ALERT_WINDOW是隐藏变量(值为24),不能直接引用
if (!AuthorityUtil.checkOp(this, 24)) { // 未开启悬浮窗权限
Toast.makeText(this, "请先给该应用开启悬浮窗权限", Toast.LENGTH_SHORT).show();
// 跳到悬浮窗权限的设置页面
AuthorityUtil.requestAlertWindowPermission(this);
}
// 显示悬浮窗
openFloatWindow();
}
其中,openFloatWindow
函数原型如下:
private void openFloatWindow() {
if (mFloatWindow == null) {
// 创建一个新的悬浮窗
mFloatWindow = new FloatWindow(MainApplication.getInstance());
// 设置悬浮窗的布局内容
mFloatWindow.setLayout(R.layout.float_notice);
// 设置悬浮窗的点击监听器
mFloatWindow.setOnFloatListener(v -> mFloatWindow.close());
}
if (mFloatWindow != null && !mFloatWindow.isShow()) {
mFloatWindow.show(Gravity.LEFT | Gravity.TOP); // 显示悬浮窗
}
}
值得注意的是mFloatWindow.setLayout(R.layout.float_notice);
设置悬浮窗的布局内容操作,通过这个操作设置悬浮窗的页面布局就可以实现不同的功能效果。
代码效果
代码执行后效果如下,在界面右上角显示悬浮窗。
同时这个悬浮窗实现了拖动以及点击就会隐藏的功能。
工程源码
点击源码链接就可以跳转到源码下载位置。