tencent cloud

文档反馈

悬浮窗(TUILiveKit)

最后更新时间:2024-11-22 17:31:13

    功能介绍

    悬浮窗功能允许主播和观众在不退出直播间的情况下,进入到小窗口模式,小窗口悬浮在屏幕上,您可以自由拖拽到合适的位置,悬浮窗内可以显示直播画面。在悬浮窗模式下,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 // 语聊场景悬浮窗内容视图。语聊暂未支持悬浮窗。
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持