Float Window
功能介绍
悬浮窗功能允许主播和观众在不退出直播间的情况下,进入到小窗口模式,小窗口悬浮在屏幕上,您可以自由拖拽到合适的位置,悬浮窗内可以显示直播画面。在悬浮窗模式下,App 可以切换到别的场景或者退后台,点击悬浮窗还可以恢复到正常全屏直播界面。
使用说明
原理简介
悬浮窗的原理是,在 WindowManager 上添加自定义视图作为悬浮窗的内容。在Android6.0及以上系统,需要申请悬浮窗权限。
快速接入
悬浮窗功能核心代码:
// 文件位置:Android/tuilivekit/src/main/java/com/trtc/uikit/livekit/component/floatwindow/corecore // 悬浮窗核心功能的实现目录├── 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() {@Overridepublic void onClickWindow() {// 收到点击悬浮窗的通知,通常您需要在此实现的业务逻辑是:切换到正常全屏模式,并关闭悬浮窗。}@Overridepublic 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
时使用的 context
是 ApplicationContext
而非 Activity
。LiveCoreView liveCoreView = new LiveCoreView(context.getApplicationContext());
参考实现
Android/tuilivekit
直播场景默认实现了悬浮窗功能,可以供您参考:// 文件位置:Android/tuilivekit/src/main/java/com/trtc/uikit/livekit/component/floatwindowfloatwindow // 悬浮窗功能的实现目录├── service // LiveKit 悬浮窗业务相关目录│ └── FloatWindowManager.java // 负责实现悬浮窗模式与正常模式切换等业务├── store // LiveKit 悬浮窗状态相关目录│ └── FloatWindowStore.java└── view // LiveKit 悬浮窗视图相关目录├── VideoFloatView.java // 直播场景悬浮窗内容视图└── VoiceFloatView.java // 语聊场景悬浮窗内容视图。语聊暂未支持悬浮窗。