Float Window

功能介绍

悬浮窗功能允许主播和观众在不退出直播间的情况下,进入到小窗口模式,小窗口悬浮在屏幕上,您可以自由拖拽到合适的位置,悬浮窗内可以显示直播画面。在悬浮窗模式下,App 可以切换到别的场景或者退后台,点击悬浮窗还可以恢复到正常全屏直播界面。




使用说明

原理简介

悬浮窗的原理是,在 WindowManager 上添加自定义视图作为悬浮窗的内容。在Android6.0及以上系统,需要申请悬浮窗权限。

快速接入

悬浮窗功能核心代码:
// 文件位置:Android/tuilivekit/src/main/java/com/trtc/uikit/livekit/component/floatwindow/core
core // 悬浮窗核心功能的实现目录
├── impl // 悬浮窗的具体实现
├── FloatWindow.java // 悬浮窗功能对外接口
└── FloatWindowObserver.java // 悬浮窗监听器
如果您没有使用 Android/tuilivekit,您可以将该目录拷贝到您的工程中使用。
快速实现悬浮窗的示例代码:
// contentView 是您要放在悬浮窗上展示的内容视图,请需要替换成自己的视图。
// contentView 上的状态、事件和业务逻辑等由您自己负责。FloatWindow 只是负责把 contentView 展示出来。
TextView contentView = new TextView(this);
contentView.setBackgroundColor(0xE022262E);
contentView.setTextColor(Color.YELLOW);
contentView.setGravity(Gravity.CENTER);
contentView.setText("This is a float window");

FloatWindow floatWindow = FloatWindow.getInstance();
floatWindow.setView(contentView);
floatWindow.show();
示例悬浮窗的效果图如下:



申请悬浮窗权限:
首先在AndroidManifest.xml中注册android.permission.SYSTEM_ALERT_WINDOW权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
</manifest>
然后动态申请权限:
FloatWindow floatWindow = FloatWindow.getInstance();
if (floatWindow.hasPermission()) {
floatWindow.setView(contentView);
floatWindow.show()
} else {
floatWindow.requestPermission();
}
注意:
Android6.0 及以上系统,需要申请悬浮窗权限。您也可以自己实现申请悬浮窗权限的逻辑,只要在获得悬浮窗权限后调用 FloatWindow 的 show 方法即可。
监听悬浮窗事件:
FloatWindow floatWindow = FloatWindow.getInstance();
floatWindow.setObserver(new FloatWindowObserver() {
@Override
public void onClickWindow() {
// 收到点击悬浮窗的通知,通常您需要在此实现的业务逻辑是:切换到正常全屏模式,并关闭悬浮窗。
}

@Override
public void onMove(int x, int y) {
// 收到悬浮窗移动的通知
}
});
自定义悬浮窗设置:
FloatWindow floatWindow = FloatWindow.getInstance();
floatWindow.setSize(width, height);
floatWindow.setLocation(x, y);
floatWindow.setMarginToEdge(margin);

模式切换

通常,悬浮窗模式与正常模式需要互相切换。相关步骤如下:
正常模式切换到悬浮窗模式
悬浮窗模式切换到正常模式
申请悬浮窗权限(如果有权限那么无需申请);
创建内容视图,并设置给悬浮窗;
退出 Activity,但要保留相关业务的数据和状态。
弹出悬浮窗。
监听悬浮窗事件;
在收到 onClickWindow 通知时,关闭悬浮窗,然后跳转回到原来的 Activity,并恢复相关业务的数据和状态。
注意:
悬浮窗功能本身只需要您传入一个内容视图即可,与您的业务没有任何关联。
模式切换过程需要保存/恢复相关业务数据和状态,这部分功能取决于您的代码架构和具体业务,所以需要您自行实现。
直播场景里,模式切换过程中,您需要使用同一个 LiveCoreView 对象,用于在两种模式下展示直播内容,这样不但可以共享视图,还可以共享直播数据和状态。



如上图所示,正常模式是LiveActivity场景,悬浮窗模式是LiveFloatWindow场景,在模式切换过程中,可以使用同一个 LiveCoreView 对象,以保证直播过程正常进行。由于 LiveCoreView 要在LiveActivity 销毁后依然能在 LiveFloatWindow 使用,所以创建 LiveCoreView时使用的 contextApplicationContext 而非 Activity
LiveCoreView liveCoreView = new LiveCoreView(context.getApplicationContext());

参考实现

Android/tuilivekit 直播场景默认实现了悬浮窗功能,可以供您参考:
// 文件位置:Android/tuilivekit/src/main/java/com/trtc/uikit/livekit/component/floatwindow

floatwindow // 悬浮窗功能的实现目录
├── service // LiveKit 悬浮窗业务相关目录
│ └── FloatWindowManager.java // 负责实现悬浮窗模式与正常模式切换等业务
├── store // LiveKit 悬浮窗状态相关目录
│ └── FloatWindowStore.java
└── view // LiveKit 悬浮窗视图相关目录
├── VideoFloatView.java // 直播场景悬浮窗内容视图
└── VoiceFloatView.java // 语聊场景悬浮窗内容视图。语聊暂未支持悬浮窗。